如何调用泛型方法与给定类型的对象? [重复](How to call generic metho

2019-07-17 16:35发布

这个问题已经在这里有一个答案:

  • 如何使用反射来调用一个泛型方法? 7个回答

我想打电话给我的泛型方法与给定类型的对象。

void Foo(Type t)
{
     MyGenericMethod<t>();
}

显然行不通。

我怎样才能使它发挥作用?

Answer 1:

您的代码示例将无法正常工作,因为通用的方法需要一个类型标识符,而不是一个Type类的一个实例。 你将不得不使用反射来做到这一点:

public class Example {

    public void CallingTest()
    {
        MethodInfo method = typeof (Example).GetMethod("Test");
        MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
        genericMethod.Invoke(this, null);

    }

    public void Test<T>()
    {
        Console.WriteLine(typeof (T).Name);
    }
}

请记住,这是非常脆弱的,我宁愿建议寻找另一种模式来调用你的方法。

另一个哈克的解决方案(也许有人可以使它有点清洁剂)是使用一些魔法表情:

public class Example {

    public void CallingTest()
    {
        MethodInfo method = GetMethod<Example>(x => x.Test<object>());
        MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
        genericMethod.Invoke(this, null);

    }

    public static MethodInfo GetMethod<T>(Expression<Action<T>> expr)
    {
        return ((MethodCallExpression) expr.Body)
            .Method
            .GetGenericMethodDefinition();
    }

    public void Test<T>()
    {
        Console.WriteLine(typeof (T).Name);
    }
}

注意使“对象”类型标识符作为在lambda一个通用类型参数。 无法弄清楚这么快怎么去解决这一问题。 无论哪种方式,这是编译时的安全,我认为。 我就觉得不对莫名其妙:/



Answer 2:

你需要使用反射,不幸的是(对贾里德提到的原因)。 例如:

MethodInfo method = typeof(Foo).GetMethod("MyGenericMethod");
method = method.MakeGenericMethod(t);
method.Invoke(this, new object[0]);

很明显,你会希望更多的错误在现实中检查:)


附注:我的本地MSDN不指定从MakeGenericMethod参数是参数数组,所以我会预计需要:

method = method.MakeGenericMethod(new Type[] { t });

但现在看来,这在现实中一个参数数组,并在线MSDN文档同意。 奇。



Answer 3:

这种方法是行不通的。 之所以是类型为对象谁的类型是在运行时确定。 但是你要使用它来调用一个通用的方法。 一个通用的方法调用的类型在编译时建立的。 因此,一个类型对象永远不能被用于在一个通用的方法的类型的参数。



文章来源: How to call generic method with a given Type object? [duplicate]