N号林克

导航

C#反射复习

反射能够对数据集中的元数据进行访问。

以前当代码编译成机器语言时,关于代码的元数据(例如类型和方法名)都会被丢弃,但当C#编译成CIL时,它会维持关于代码的大部分元数据。利用反射可以找出满足条件的元数据。合理利用反射可以降低代码的耦合性

 

System.Type访问元数据

主要有Type.Name、Type.IsPublic、Type.BaseType等等

 

typeof、GetType获取数据类型

 

各种info与get方法访问元数据

创建类的实例

例子:

namespace ConsoleApp1
{
    class Re
    {
        public string a;
        public int b;
        public Re()
        {
            Console.WriteLine("no param");
        }
        public Re(string _a, int _b)
        {
            a = _a;
            b = _b;
        }
        public int bp { get; set; }
        public string ap { get; set; }

        public void Show()
        {
            Console.WriteLine("A:" + a + "    B:" + b);
        }
    }
    class Use
    {
        public static void Main(string[] args)
        {
            Type t = typeof(Re);
            FieldInfo[] fieldInfo = t.GetFields();
            foreach (var item in fieldInfo)
            {
                Console.WriteLine(item);
            }
            MethodInfo[] methodInfo = t.GetMethods();
            foreach (var item in methodInfo)
            {
                Console.WriteLine(item);
            }
            ConstructorInfo[] constructorInfo = t.GetConstructors();
            foreach (var item in constructorInfo)
            {
                Console.WriteLine(item);
            }
            Type[] types = new Type[2];
            types[0] = typeof(string);
            types[1] = typeof(int);
            ConstructorInfo constructor = t.GetConstructor(types);

            object[] obj = new object[] { "avs", 123 };
            object re = constructor.Invoke(obj);
            ((Re)re).Show();

            object o = Activator.CreateInstance(t, obj);
            ((Re)o).Show();

            PropertyInfo p1 = t.GetProperty("ap");
            p1.SetValue(o, "qwe", null);
            p1.GetValue(o);
            MethodInfo mi = t.GetMethod("Show");
            mi.Invoke(o, null);
           // Assembly ass = Assembly.GetExecutingAssembly();
           // object obj = ass.CreateInstance("ConsoleApp1.Re");
           // ((Re)obj).Show();
        }
    }
}

posted on 2020-09-04 16:15  N号林克  阅读(114)  评论(0编辑  收藏  举报