c#反射 通过类名获取实例和属性,方法

本文介绍了C#中的反射机制,通过元数据获取程序集和类型信息。详细阐述了如何利用Type和Assembly类动态创建实例、访问属性和方法。反射在运行时提供了强大的动态操作能力,包括判断对象类型、构造对象、获取类成员以及调用对象方法等。

**

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);
                   }
        }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值