【.NET】反射
来源:互联网 发布:spark入门例子linux 编辑:程序博客网 时间:2024/05/18 22:10
什么是反射?
反射是.net的一种重要机制,通过反射在运行时获取程序(exe)或程序集(dll)中每一个类型(包含类,结构,委托,接口,枚举等)的成员和成员的信息,还可以创建这些类型的对象 。(简单的说,有了反射,你就可以通过程序和程序集获取你想要的一切信息和资源。。。)
如何使用反射?
- 反射的命名空间
- System.Reflection
- System.Type
- System.Reflection.Assembly
- 加载程序集
- 方法1: 将dll或exe拷贝至当前项目的运行程序所在目录下,如:“Test.dll"
- Assembly assembly = Assembly.Load("Test");
- 方法2: 直接加载具体路径下的程序集,如:”D:\Test\Test.dll“
- Assembly assembly = Assembly.LoadFrom(@"D:\Test\Test.dll");
- 获取类型
- 方法1: 通过 已知的类名获取类型,如:“Test.CTest"
- Type type = assembly.GetType("Test.CTest");
- 方法 2: 通过程序集遍历所有的类型
foreach(var type in assembly.GetTypes()){//代码段}
- 反射创建对象(通过类型创建实例)
- object obj = Activator.CreateInstance(type);
- 反射调用实例方法,静态方法,重载方法
- 方法一: 通过已知方法名调用方法,如:方法“void Func()"
- MethodInfo method = type.GetMethod("Func");
- method.Invoke(obj, null);
- 方法二: 遍历方法再调用
-
foreach(var method in type.GetMethods()){ method.Invoke(obj, null); //此示例调用的是类的无参公共成员方法 }
- 反射调用私有方法,泛型方法
- 反射私有方法:
foreach(var method in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public |BindingFlags.Instance|BindingFlags.Static)){ if (method.Name.Equals("Func1")) { method.Invoke(obj, null); //实例方法 需要传入实例和参数,无参可传入null } else if (method.Name.Equals("Func2")) { method.Invoke(null, new object[] { 100 }); //类方法的调用可以不用传入实例 }}
- 反射泛型方法, 如:函数签名 public void FuncGeneric<T>( T tParameter );
if(method.Name.Equals("FuncGeneric")) { MethodInfo methodTmp = method.MakeGenericMethod(typeof(string)); methodTmp.Invoke(obj, new object[] { "hello, kitty" }); }
- 反射字段和属性
- 反射字段,如: 有字段 int iD, string name
foreach(var value in type.GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static| BindingFlags.Instance)){if(value.Name.ToString().Equals("Name")) { value.SetValue(null, "Xiaowangba"); } else if(value.Name.ToString().Equals("ID")) { Console.WriteLine("Field ID={0}",value.GetValue(obj)); //如果是类字段 即可不用传入实例,直接传入null即可 }}
- 反射属性,如: 有属性 int Age{set;get;}
foreach(var property in type.GetProperties()){ if(property.Name.Equals("Age")) { Console.WriteLine("Age = {0}", property.GetValue(obj)); property.SetValue(obj, 18); Console.WriteLine("After SetValue: Age = {0}", property.GetValue(obj)); } }
0 0
- .Net 反射
- .net反射
- .Net反射
- .net 反射
- .Net反射
- .NET反射
- net反射
- .net 反射
- .net 反射
- .net 反射
- .net反射
- .Net 反射
- .net反射
- 【.NET】反射
- net反射
- .Net 中的反射(反射特性)
- .Net 中的反射(反射特性)
- .net反射的问题。
- 系统之家重装大师使用方法
- iOS开发常用数学函数
- 使用Bitbucketc(GIT)代码托管
- 一个旋钮的Demo
- 对伪心理学说不
- 【.NET】反射
- 动态修改listview
- Java----可变参数
- 洛谷 P1908 逆序对
- Groovy入门-闭包
- Spark运行原理
- hdu 5976 Detachment(数论,一个结论)
- DIAODU
- JIT(动态编译)和AOT(静态编译)编译技术比较