又番的自留地

偷菜不如偷师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
泛型反射和普通反射的区别就是泛型参数的处理上

先看一个简单的例子。

class Class1<T>
{
  public void Test(T t)
  {
    Console.WriteLine(t);
  }
}

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

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

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

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

另外一种情况就是泛型方法,
class Class1
{
  public void Test<T>(T t)
  {
    Console.WriteLine(t);
  }
}

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

static void InvokeTest(Type t, params object[] args)
{
  Type type = typeof(Class1);
  object o = Activator.CreateInstance(type);
  MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);

  method = method.MakeGenericMethod(t);
  method.Invoke(o, args);
}
posted on 2011-04-09 22:29  Kyle.cj  阅读(544)  评论(0编辑  收藏  举报