,,C#中的反射(System.Reflection)

,,C#中的反射(System.Reflection)

这篇文章介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: