不知道编译时类型,该如何调用通用函数?

5
假设我有以下情况:

Type somethingType = b.GetType();
    // b is an instance of Bar();

Foo<somethingType>(); //Compilation error!!
    //I don't know what is the Type of "something" at compile time to call
    //like Foo<Bar>();


//Where:
public void Foo<T>()
{
    //impl
}

如果在编译时不知道类型,应该如何调用通用函数?


1
可能是C#在运行时指定泛型集合类型参数的重复问题。 - Andrey
1
请使用搜索功能,在提问之前查找其他答案。 - Andrey
可能是如何使用反射调用泛型方法?的重复问题。 - nawfal
1个回答

12

你需要使用反射:

MethodInfo methodDefinition = GetType().GetMethod("Foo", new Type[] { });
MethodInfo method = methodDefinition.MakeGenericMethod(somethingType);
method.Invoke();

编写泛型方法时,最好尽可能提供非泛型的重载方法。例如,如果Foo<T>()的作者添加了一个Foo(Type type)重载,您就不需要在此处使用反射。


2
只需要一个更正:MethodInfo method = methodDefinition.MakeGenericMethod(somethingType); - Nissim
1
谢谢,已经更正了。这个问题可能是我 Stack Overflow 单元测试套件中漏掉的。 - Tim Robinson
如果函数 "Foo<T>()" 是类型的扩展方法,它会被列在 MethodInfo[] 中吗?或者 GetMethod(..) 中呢? - 123Developer
1
不,它将成为定义扩展方法的任何类上的静态方法。 - Tim Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接