C#高级编程 反射 代码示例

时间:2022-06-04 23:25:18

反射

反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。

还可以获得每个成员的名称、限定符和参数等。

设计模式中

采用反射技术可以简化工厂的实现

1.工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。

2.抽象工厂:使用反射可以减少抽象工厂的子类。

采用反射技术可以极大简化对象的生成

1.命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。

2.享元模式:采用反射技术实例化享元可以简化享元工厂。

反射演示代码,如下:

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        //[STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());

            System.Console.WriteLine("列出程序集中的所有类型");
            //System.Reflection.Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块
            Assembly a = Assembly.LoadFrom("Reflection.exe");
            //类型声明
            Type[] mytypes = a.GetTypes();

            foreach (Type t in mytypes)
            {
                System.Console.WriteLine(t.Name);
            }

            System.Console.ReadLine();
            System.Console.WriteLine("列出HellWord中的所有方法");

            Type ht = typeof(HelloWorld);
            // System.Reflection.MethodInfo 发现方法的属性并提供对方法元数据的访问
            MethodInfo[] mif = ht.GetMethods();

            foreach (MethodInfo mf in mif)
            {
                System.Console.WriteLine(mf.Name);
            }

            System.Console.ReadLine();
            System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法");

            //实例化HelloWorld
            Object obj = Activator.CreateInstance(ht);
            string[] s = { "zhenlei" };
            //实例化HelloWorld
            Object objName = Activator.CreateInstance(ht, s);
            // System.Reflection.BindingFlags
            //指定控制绑定和由反射执行的成员和类型搜索方法的标志。
            //此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
            BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            MethodInfo msayhello = ht.GetMethod("SayHello");
            msayhello.Invoke(obj, null);
            msayhello.Invoke(objName, null);

            System.Console.ReadLine();
            System.Console.Read();
        }
    }
    /// <summary>
    /// HelloWorld类
    /// </summary>
    public class HelloWorld
    {
        string myName = null;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name"></param>
        public HelloWorld(string name)
        {
            myName = name;
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        public HelloWorld()
            : this(null)
        { }
        /// <summary>
        /// 属性
        /// </summary>
        public string Name
        {
            get
            {
                return myName;
            }
        }
        /// <summary>
        /// 方法
        /// </summary>
        public void SayHello()
        {
            if (myName == null)
            {
                System.Console.WriteLine("Hello World");
            }
            else
            {
                System.Console.WriteLine("Hello," + myName);
            }
        }
    }