当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何使用typeof或GetType()作为Generic的模板?》经验,为你挑选了3个好方法。

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

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

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

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

原因上述方法不起作用.



1> 小智..:

你不能.必须在编译时解析.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 instance)
    {
        Console.WriteLine("called " + instance);
    }
}

MakeGenericMethod.


这是一个非常确定的答案.太糟糕了,这是不正确的.您可以通过反射使用在运行时解析的泛型参数来调用泛型方法.它并不总是令人满意,人们可能想知道为什么在实际使用它之前必须这样做,但这是可能的.

2> devi..:
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()
    {
        Console.WriteLine(typeof(T).ToString());
    }
}

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



3> Stefan Turca..:

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

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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有