c#反射 通过类名获取实例和属性,方法
2019-03-26 20:44
2919 查看
**
c#反射 通过类名获取实例和属性,方法
**
元数据
程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据;有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
反射
一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射。
程序集
.net 应用程序的部署单元。.net应用程序包含一个或多个程序集。通常拓展名是exe或dll的 .net可执行文件被称为程序集。
Type类
BCL声明的抽象类,它被设计用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型的信息。
Assembly类
在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,它也包含了可以加载和执行程序集。
实现
- .Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
- .Net反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;
获得Type和Assembly对象的接口:
//通过反射获取Assembly对象 //1.获取当前正在运行的程序集 //1.1通过当前对象获取类型所属的程序集 Assembly ass1 = this.GetType().Assembly; //1.2通过静态方法获取正在运行的程序集 Assembly ass2 = Assembly.GetExecutingAssembly() //2.根据当前【应用程序域】获取程序集 Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies(); //3.根据指定的程序集路径加载程序集 Assembly ass3 = Assembly.LoadFrom(@path); //通过反射获得Type对象 //1.通过typeof 获取类对应的类型 Type t1 = typeof(Object); //2.通过对象的GetType方法 -- GetType方法 来自 Object 类! Type t2 = Object.GetType(); //3.通过 程序集 获取类 Assembly curAss = Assembly.GetExecutingAssembly(); 或者curAss = Object.GetType().Assembly //获取程序集里指定名称的类型对象 注意:必须写类的全名称!即类的完全限定名 = namespace+"."+classname Type t4 = curAss.GetType(namespace+"."+classname); //获取程序集里所有的类型对象 Type[] types = curAss.GetTypes(); //获取程序集里所有公共的类型对象 Type[] publicTypes = curAss.GetExportedTypes();
示例代码:
//测试类 namespace AAA { public class TestClass{ public int id{ get{return id;} set{id = value}; } public void Add(){ } } } public void GetTypeClassPropertiesAndFunc(string className){ Type classype=null; //根据类名获取Type对象 //1.通过完全限定名 string fullType = AAA+ "."+className; classype=Type.GetType(fullType ); //2.如果上面的方式得不到,可以通过遍历程序集查找 //得到所有程序集 Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies(); Type[] types = null; foreach(Assembly assembly in assemblys){ //得到此程序集中所有类型 types = assembly.GetTypes(); if(types != null){ foreach(Type test in types){ //判断类型的名字是否与类名一致,忽视大小写 if(test.Name.Equals(className,StringComparison.CurrentCultureIgnoreCase)){ type = test; break; } } } if(type != null){ break; } } if(type != null){ //属性 //此接口只有类中的字段必须封装才能获得 Properties[] propertys = type.GetProperties(); int i = 0; foreach(Properties property in propertys ){ // 获取属性名 Debug.LogError("property name : " + property.Name); // 给属性赋值 property.SetValue(Tclass, System.Convert.ChangeType( i, property.PropertyType), null); // 获取属性值 Debug.LogError(property.GetValue(Tclass, null)); } //方法 MethodInfo method = type.GetMethod("Add"); method.Invoke(object,null); //字段 FieldInfo[] fieldInfos = type.GetFields(); foreach(FieldInfo fieldInfo in fieldInfos){ Debug.Log( fieldInfo.Name); Debug.Log(fieldInfo.FieldType.Name); } } }
相关文章推荐
- C#反射 获取程序集信息和通过类名创建类实例
- C#反射 获取程序集信息和通过类名创建类实例
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- C# 通过反射获取MVC Controller里的类名,方法名,参数列表,返回值类型,Description描述,自定义Attribute
- [No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法
- C#反射实例应用--------获取程序集信息和通过类名创建类实例
- C#反射 获取程序集信息和通过类名创建类实例
- C#反射 获取程序集信息和通过类名创建类实例
- C#反射实例——获取及设置对象属性,运行对象方法
- C#反射通过类名的字符串获取生成对应的实例
- C#利用反射机制,获取实例的属性和属性值
- C#中的特性 和 通过反射获取属性上的特性
- 通过反射获取街道这个类的所有属性、所有方法信息
- 6.通过反射动态创建对象,获取属性,获取方法
- C#通过反射获取对象属性,打印所有字段属性的值
- 通过反射获取对象实例之newInstance方法
- Unity热更新之C#反射动态获取类属性及方法
- java 通过反射获取调用类方法及属性
- C#通过反射让Request对象只读属性可写的方法
- C#通过属性名称获取(读取)属性值的方法