记录一下学反射过程中遇见的相关问题

反射调用构造函数创建对象

我们可以用System.Reflection中的Assembly 类来获取相应的程序集在.net文档中有具体实现方法可以自行去查看
**load()**方法
例如:

在这里插入代码片
 Assembly SampleAssembly = Assembly.Load
            ("SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3");

Assembly.LoadFrom 方法
例如:

Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");

也可以用Type.Assembly 属性获取,可能还有其他方法可以自行查看文档

获取到相应的程序集之后可以用Assembly.GetType 方法 获取到该程序集中指定类型的type对象 之后就可以调用构造函数创建对象了。
可以用Activator.CreateInstance 方法创建对象 该方法中有很多重载可以根据需求自行调用相应的重载。例如:

 object objtext = Activator.CreateInstance(Type);

同样也可以用Type.GetConstructor 方法找到相应的构造方法,用ConstructorInfo.Invoke方法调用相应的构造函数创建对象
例如:

   var cons = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,null, new Type[] { typeof(int) } ,null);
   cons.Invoke(new object []{1 });
  

反射调用方法

获取到程序集中对应类型的type对象之后用Type.GetMethod 方法 获取指定的方法,MethodBase.Invoke 方法调用指定方法
例如

            var me1 = ty.GetMethod("a", new Type[] { typeof(int),typeof(int)});
            me1.Invoke(objtext, new object[] { 1, 1 });

调用泛型方法同上述方法相似 不过有些版本没有对应 调用泛型方法重载 的方法调用时需要去对其进行一定的判断(或许有更好的办法我不知道有知道的可以指点我一下)
我的办法是获取到全部的方法遍历通过条件判断进行区分调用
如下:

  //泛型方法的重载
  var me = ty.GetMethods();
  foreach (var m in me)
  {
      if (m.Name == "a")
      {
          if (m.IsGenericMethod)
          {
              if (m.GetGenericArguments().Length == 2)
              {     //GetParameters()
                  var mnew = m.MakeGenericMethod(new Type[] { typeof(int), typeof(int) });
                  mnew.Invoke(objtext, new object[] { 1, 1 });
              }
          };
      }
     
  }

高版本的.net里面Type.GetMethod 方法 有相应的重载可以直接使用。可以去查一下文档

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值