C#反射Reflection

照就是动态获取程序集中之首届数据,直接通过.dll来创建对象,调用成员。

Type是反射一个首要之类似。通过Type获取类吃有着消息,包括方法,属性等。

如出一辙、Type的简要利用

1.透过typeof(类型名)或类实例.GetType()的方式获得有项目的Type。

2.经过GetFields方法好取项目受到之持有属性。

3.Activator.CreateInstance(类型的Type)可以创建项目的实例。

4.IsInstanceOfType(),判断是否是有平品种的的实例。

5.IsAssignableFrom(),判断是否会用后者类型的实例赋值给前者类型。

6.IsSubclassOf(),判断有一样对象类型是否也“抽象类”,这里的抽象类指的是不得以实例化的切近。

7.BaseType,获取父类的种。

C# 1

二、反射Reflection

1.经Assemly.LoadFile()静态方法加载一个程序集,程序集可以用作是包裹了森好像的文书。

2.GetTypes得程序集中具有的近乎,GetType()获取指定类名的类似,这是得指定类的真名,即程序集的名+类的讳。

3.GetExportedTypes(),获取有的公有类,这个艺术是造访不交私有类的。

5.GetMehod(),这里要注意的凡,如果找的办法来重载,直接通过措施名来搜索是摸索不顶之,

此地用经第二单参数来选择,类型也Type[],如果想搜寻无参数的法,定义也new
Type[]{}即可,不需写任何的数。

倘若生参数,则以梯次写好即可。

6.通过MethodInfo的Invoke()方法来实行搜到之法子,这里要传入一个靶用来指示是甚型的点子,还欲传入参数,这个法子是匪存在1个参数的重载的,

拍卖办法与第5点同样,如果无则形容成new object[]{}即可。

7.GetProperty()搜索指定的性能,类型为PropertyInfo。

8.PropertyInfo经GetValue()获取属性的价,SetValue()获取属性之。

9.创办实例的蝇头种植办法

a.Activator.CreateInstance(),但是Activator属性System命名空间,不知是否属反射的办法。

b.通过构造函数的主意创建,由上述可以,通过Type可以博得指定项目的章程,则就是得赢得到构造函数,

系统已经持续了GetConstructor()的计,猜想中应该也通过GetMethod实现的,这样经过执行搜到

的构造函数就可博到对应品种的实例了。

10.总结

a.认情况下,GetMothod和GetProperty都是请不至近似的私成员的,由方的重载可知,这片独道的重载中

还有BindingFlags的枚举选项,并且是枚举还是标志枚举,枚举成员之内无是相互排挤的,而是互相配合的。

它可以同于与或无的操作来满足工作的待。这里就是拿这枚举设置为BindingFlags.NonPublic|BindingFlags.Instance,

意味着为找匹配吗非公共类型和实例类型,这样虽会见拿民用类型加入到找寻范围外。

b.广大艺术的重载方式一样通用的,例如在实施办法C#、搜索方法与寻找构造函数时,都急需传入数组类型的靶子,

此刻要没有参数,则一直声明不开展赋值即可。

c.搜索到的近乎是足以转换为本来类型的实例的,通过as方法会对回到null时无报错。

d.反射是在线升级软件的一致种植方法,可以在初始版本中养读取的次第集的“接口”,而先后集待按预定的样式书写。

诸如此类在发生次集放入时,程序启动来,就会失去读取dll文件,并根据中的情做出相应的“升级”。

            Assembly asm = Assembly.LoadFile(@"G:\test\demo\myLibClass\bin\Debug\myLibClass.dll");
            //获取所有的类
            Type[] types = asm.GetTypes();
            for (int i = 0; i < types.Length; i++)
            {
                textBox1.AppendText(types[i].Name + "\r\n");
            }

            //获取所有的公有类
            Type[] t1 = asm.GetExportedTypes();

            for (int i = 0; i < t1.Length; i++)
            {
                textBox1.AppendText(t1[i].Name + "\r\n");
            }
            //获取指定的类型  需要填写全名 即命名空间+类名
            Type t2 = asm.GetType("myLibClass.student");

            //获取类型的某个方法
            MethodInfo m1 = t2.GetMethod("sayHi", new Type[] { });
            t2.GetMethod("", BindingFlags.NonPublic | BindingFlags.Instance);
            t2.GetProperty("", BindingFlags.NonPublic | BindingFlags.Instance);

            //根据类型创建对象
            object obj = Activator.CreateInstance(t2);

            string sss = m1.Invoke(obj, new string[] { }) as string;

            //获取类型的构造函数
            ConstructorInfo info = t2.GetConstructor(new Type[] { });

            //通过执行构造函数创建对象
            object stu = info.Invoke(obj, new object[] { });

            //获取属性
            PropertyInfo pinfo = t2.GetProperty("id");

            //设置属性的值  null表示该属性不是索引索性
            string id = pinfo.GetValue(obj, null).ToString();

  

相关文章