这篇文章介绍了C#中的反射(系统。反射),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一、获取程序集Assembly
1、获取当前运行的程序集
系统。反射Assembly[] asm=AppDomain .当前域。GetAssemblies();
//
装配b=装配getexecutionassembly();
2、获取指定文件的程序集:加载,加载自,加载文件方法。
组件c=组件load(' mscorlib。dll’);//如果你引用了程序及,那么就直接负载()方法,参数里面程序集名称就可以加载了10 .装配c=装配load(' mscorlib ');
组件d=组件LoadFrom(AppDomain .当前域。“基目录”mscorlib。dll’);//LoadFrom只能用于加载不同标识的程序集,也就是唯一的程序集,不能用于加载标识相同但路径不同的程序集。
装配e=装配LoadFile(AppDomain .当前域。“基目录”mscorlib。dll’);//加载文件:只加载指定文件,但不会自动加载依赖程序集
二、获取类型Type (指Class类):
装配组件=程序集getexecutionassembly();
Type[] tArr=asm .GetExportedTypes();//获取程序集中定义的公共类型
1、从类字符串中获得类型对象:装配. GetType(" "),模块. GetType(" "),类型. GetType(" ")
ass=装配.LoadFrom(@ ' C:\ bin \ Debug \ console应用程序2。exe’);
控制台WriteLine(屁股GetType('ConsoleApplication2 .人')。ToString());//根据程序集(dll或exe)获取里面的班级
模块模块=组件get modules()[0];
控制台WriteLine(mod .GetType('ConsoleApplication2 .人')。ToString());
类型类型=类型GetType('System .int 32’);//静态方法,参数为完全限定名(首选)
类型类型=类型GetType('MyAssembly .'' Example ',false,true) //注意0是类名,参数一表示若找不到对应类时是否抛出异常,参数2表示类名是否区分大小写
2、从具体类中获得类型对象:类型关于运算符
类型t4=类型of(测试空间测试类);//使用类型关于运算符
3、从实例中获得类型对象:对象GetType()
Example=新示例();
类型类型=示例. GetType();
类型t3=42 .GetType();//根据对象实例获取类型
4、类型的属性
t.IsPublic
t.is抽象;
t.IsClass
t.IsValueType
三、获取成员MemberInfo
成员信息[]miArr=t . get成员(绑定标志.Instance | BindingFlags .公);//实例与公共成员。还有绑定标志.静态|绑定标志.非公有
foreach(miArr中的MemberInfo项目)
{
bool a=项目是FieldInfo
财产信息;
方法库;
建筑信息;
MethodInfo
EventInfo
类型;
}
t.get构造函数();//获取构造函数
t . get fields();//获取字段
t.get属性();//获取属性
t.get方法();//获取方法
t . get events();//获取事件
t.get接口();//获取接口
t.GetCustomAttributes(true);//获取类型上标记的自定义属性
在系统。反射命名空间内包含多个反射常用的类:
装配:通过此类可以加载操纵一个程序集,并获取程序集内部信息事件信息:该类保存给定的事件信息FieldInfo:该类保存给定的字段信息方法信息:该类保存给定的方法信息成员信息:该类是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为模块:该类可以使你能访问多个程序集中的给定模块参数信息:该类保存给定的参数信息属性信息:该类保存给定的属性信息
四、获取具体成员
t型=装配GetExecutingAssembly().GetType('TestSpace .测试类’);
方法信息m=t . get方法('测试方法');
参数info[]p=m . get parameters();//获取方法参数
五、创建实例
1、根据装配创建类型实例:asm .CreateInstance()
装配组件=程序集getexecutionassembly();
TestClass obj=asm .CreateInstance('TestSpace .测试类’);//根据装配创建类型实例
2、根据类型创建实例:Activator.CreateInstance()
类型t=类型GetType('TestSpace .测试类’);
测试类obj=(测试类)激活器.创建实例(t);//1、根据类型创建实例
测试类obj=(测试类)激活器.CreateInstance(t,new object[]{ ' aa ' });//2、根据"有参数的构造函数"创建实例
//
test class obj=(test class)t . invoke成员(' test class ',BindingFlags).CreateInstance,null,null,null);
六、调用方法
1、调用实例方法:调用
方法信息m=t . get方法(' WriteString ');
object returnValue=m.Invoke(obj,new object[] { 'test ',1 });//传两参数,若方法无参数,可以将引起的第二个参数设为空
//或者
object returnValue=m.Invoke(obj,BindingFlags .公共,类型DefaultBinder,new object[] { 'test ',1 },null);//最后一个参数表示文化。
2、调用静态方法
方法信息m=t . get方法(“静态方法”);
对象返回值=m . Invoke(null,new object[] { 'test ',1 });
七、反射属性
通过系统。反射。属性能查找到类里面的属性。常用的方法有GetValue(object,object[])获取属性值和设置值(对象,对象,对象[])设置属性值
财产信息属性名称=类型GetProperty(' Name ');//获取名字属性对象
属性名称.设置值(对象张飞,null);//设置名字属性的值
object objName=propertyName .GetValue(obj,null);//获取属性值
根据属性的类型设置属性的值
Type type=typeof(人);//注意要输入全部路径,包括命名空间
对象obj=激活器CreateInstance(类型);
//假设这是存在于可扩展标记语言的数据
Dictionarystring,string dic=new Dictionarystring,string();
数字信息中心.Add('Id ',' 1 ');
数字信息中心.添加('名称','神灵武士');
数字信息中心.添加('生日',' 2001-01-01 ');
PropertyInfo[] ProArr=type .获取属性();
foreach(前)中的物业信息p)
{
如果(dic .钥匙。包含(p.Name))
{
页(第页的缩写)SetValue(obj,Convert .ChangeType(dic[p.Name],p.PropertyType),null);//当需要给属性设置不同类型的值时
}
}
Person person=obj as Person
控制台WriteLine(人。生日);
八、反射特性
通过系统。反射。MemberInfo的GetCustomAttributes(类型,布尔值)就可反射出一个类里面的特性。
装配装配=装配load(' fanshe ');
类型类型=程序集GetType('fanshe .人');//注意要输入全部路径,包括命名空间
对象obj=激活器CreateInstance(类型);
object[] typeAttributes=type .GetCustomAttributes(false);//获取人类的特性
foreach(类型属性中的对象属性)
{
控制台WriteLine(属性ToString());//输出系统SerializableAttribute属性因为我在人上里加了个[可序列化]
}
九、创建委托实例
测试委托我的委托=(测试委托)委托create delete(type of(test delete),obj,' my method ');
字符串返回值=我的委托(' Hello ');//执行委托
十、应用举例
1、动态加载程序集
装配组件=程序集LoadFrom(@ ' E:\ test。dll’);
类型类型=asm .GetType('TestSpace .测试类’);
对象obj=系统活化剂。创建实例(类型);//也可以使用强制转换,将目标文件转换为预定义的接口或者抽象类(如形式),直接执行基方法,不用反射获取方法.
方法信息m=类型get方法(' WriteString ');
米(米的缩写))Invoke(obj,new object[]{ ' test ' });
2、获得ListT中的T类型:
list dog dogs=new list dog();
类型类型=狗. GetType();
如果(类型. IsGenericType)
{
type[]泛型rgtypes=type .GetGenericArguments();
if(generic rgtypes[0]==的类型(Dog))
{
//你想要判断的是这个吗?
}
}
到此这篇关于C#反射(反思)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。