如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

时间:2023-01-29 14:24:04

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

悬赏分:40 | 解决时间:2008-11-25 16:37 | 提问者:rjgaoyuan
请举一个简单易懂的小例子来说明…
反射普通类和反射泛型类是不同的…

public abstract class BusinessManager
{
        /// <summary>
        /// 添加一个新实体
        /// </summary>
        /// <param name="entity"></param>
     public virtual void Add<T>(T MappedInstance) where T : Entity
        {
           Type entitymanage = typeof(EntityManager<T>);
           object obj = Activator.CreateInstance(entitymanage);
           MethodInfo method = entitymanage.GetMethod("Add");     
            method.Invoke(obj, new object[] { MappedInstance });
         }
}

类似这样的,但是这是使用反射普通类的方法,在这里有错误,希望帮我改成可以反射泛型类的,将这个改一下。
EntityManager是一个泛型类
最佳答案
泛型反射和普通反射的区别就是泛型参数的处理上。

先看一个简单的例子。

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

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

Type type = typeof(Class1);
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);
}

原文链接: http://www.xuebuyuan.com/892641.html