如何使用typeof或GetType()作为Generic的模板?

时间:2008-11-19 16:53:37

标签: .net generics

如果使用单词更难解释,让我们看一个例子 我有一个像这样的通用函数

void FunctionA<T>() where T : Form, new()
{
}

如果我有反射类型,如何将其与上述功能一起使用?我很期待这样做

Type a = Type.GetType("System.Windows.Forms.Form");
FunctionA<a>();

原因上述方法不起作用。

4 个答案:

答案 0 :(得分:13)

你做不到。必须在编译时解析.NET中的泛型。你正试图做一些能在运行时解决它们的事情。

你唯一能做的就是为FunctionA提供一个带有类型对象的重载。


嗯......评论者是对的。

class Program
{
    static void Main(string[] args)
    {
        var t = typeof(Foo);
        var m = t.GetMethod("Bar");
        var hurr = m.MakeGenericMethod(typeof(string));
        var foo = new Foo();
        hurr.Invoke(foo, new string[]{"lol"});
        Console.ReadLine();
    }
}

public class Foo
{
    public void Bar<T>(T instance)
    {
        Console.WriteLine("called " + instance);
    }
}

MakeGenericMethod

答案 1 :(得分:12)

class Program
{
    static void Main(string[] args)
    {
        int s = 38;


        var t = typeof(Foo);
        var m = t.GetMethod("Bar");
        var g = m.MakeGenericMethod(s.GetType());
        var foo = new Foo();
        g.Invoke(foo, null);
        Console.ReadLine();
    }
}

public class Foo
{
    public void Bar<T>()
    {
        Console.WriteLine(typeof(T).ToString());
    }
}

它动态工作,s可以是任何类型

答案 2 :(得分:7)

迟了几年,来自msdn博客,但这可能会有所帮助:

Type t = typeof(Customer);  
IList list = (IList)Activator.CreateInstance((typeof(List<>).MakeGenericType(t)));  
Console.WriteLine(list.GetType().FullName); 

答案 3 :(得分:0)

我以不同的方式解决了这个问题。我有一个列表类,其中封装了(实际的)Dapper功能。它从基类继承,该基类是用于模拟的虚拟类。基类中的每个方法都被真实类覆盖。然后,我不需要做任何特别的事情。如果将来我想对SQLite或本地内存数据库做一些特别的事情,我以后可以随时将其添加到基类中。