分类目录

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
泛型反射和普通反射的区别
.NET 暂无评论 阅读(2,085)

关于泛型反射普通反射和用法请在【数据库之家】中搜索站内文章,也百度谷歌一下,这里主要说说泛型反射普通反射的区别。

泛型反射和普通反射的区别就是泛型参数的处理上。
我们先看一个简单的例子。

  1. class ClassDemo1<T>
  2. {
  3.     public void Demo(T t1)
  4.     {
  5.         Console.WriteLine(t1);
  6.     }
  7. }

要利用反射动态创建该类型实例,并调用 Test 方法,我们可以使用如下方法。

  1. Type type = typeof(Class1<int>);
  2. object o = Activator.CreateInstance(type);
  3. type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });

但如果泛型参数是未定的,我们该如何处理呢?其实 Type 已经增加了类似的处理机制。

  1. static void InvokeTest(Type t, params object[] args)
  2. {
  3.     Type type = typeof(Class1<>);
  4.     type = type.MakeGenericType(t);
  5.     object o = Activator.CreateInstance(type);
  6.     type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
  7. }

另外一种情况就是泛型方法,我们继续。

  1. class Class1
  2. {
  3.     public void Test<T>(T t)
  4.     {
  5.         Console.WriteLine(t);
  6.     }
  7. }

方法类似,只不过这回使用的是 MethodInfo.MakeGenericMethod()。

  1. static void InvokeTest(Type t, params object[] args)
  2. {
  3.     Type type = typeof(Class1);
  4.     object o = Activator.CreateInstance(type);
  5.     MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
  6.  
  7.     method = method.MakeGenericMethod(t);
  8.     method.Invoke(o, args);
  9. }

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:泛型反射和普通反射的区别 | Bruce's Blog

发表评论

留言无头像?