如何根据Type对象进行泛型函数调用?

时间:2011-09-22 13:29:16

标签: c# .net-4.0

如何执行Get,当你拥有时:T表示为Type对象,即

Type type=typeof(int);

和参数param1和param2?

    public void DoCall(){
        var type=typeof(int);
        // object o=Get<type> ("p1","p2");   //<-- wont work (expected)
        // *** what should go here? ***
    }

    public IEnumerable<T> Get<T>(string param1,string param2) {
        throw new NotImplementedException();
    }

5 个答案:

答案 0 :(得分:4)

你需要使用反射:

public IEnumerable GetBoxed(Type type, string param1, string param2)
{
    return (IEnumerable)this
        .GetType()
        .GetMethod("Get")
        .MakeGenericMethod(type)
        .Invoke(this, new[] { param1, param2 });
}

答案 1 :(得分:2)

MakeGenericMethod是关键:

var get = typeof(WhereverYourGetMethodIs).GetMethod("Get");
var genericGet = get.MakeGenericMethod(type);

答案 2 :(得分:0)

直接使用泛型类型参数有什么问题?

public void DoCall(){
    IEnumerable<int> integers = Get<int> ("p1","p2");
    // ...
}

答案 3 :(得分:0)

在上面的示例中,'T'将是您传入Get方法的任何内容,它也将返回相同的IEnumerable。因此,如果您执行以下操作:

 IEnumerable<int> o = Get<int>("p1", "p2");

o将是IEnumerable

但是如果你想要别的东西,那么你只需传入一个不同的Type,因此传递Generic类型。

答案 4 :(得分:0)

如果可能,您应该重新定义Get方法以将对象类型作为参数:

public IEnumerable<object> Get(object type, string param1,string param2)
{
}

然后,如果您真的需要它,您可以按如下方式重写原始通用方法:

public IEnumerable<T> Get<T>(string param1,string param2)
{
    var result = Get(typeof(T), param1, param2);
    return result.Cast<T>();
}