问题:有(比方说)一些 Foo 方法:
public static T Foo<T>(string str)
{
return Convert.ChangeType(str, typeof(T)); // пример (тело метода не важно)
}
我可以用反射来称呼它:
MethodInfo foo = type.GetMethod("Foo"); // type - тип, где находится метод Foo
MethodInfo genericFoo = foo.MakeGenericMethod(typeof(string)); // например string
string result = genericFoo.Invoke(null, /* params... */);
但事实是该方法的第一个(也是唯一的)参数MakeGenericMethod有一个“订阅” params,它不允许我MakeGenericMethod通过“插入”一个类型数组来调用该方法:
public static object Bar(Type[] types, MethodInfo foo, object param)
{
MethodInfo genericFoo = foo.MakeGenericMethod(types); // <- это не работает
return genericFoo.Invoke(null, new object[] { param });
}
我怎样才能绕过这个限制?有替代方案MakeGenericMethod吗?
该方法
MakeGenericMethod接受对应于泛型参数的类型。的情况下
只有一个通用参数:
T此方法与括号内的类型无关。
要调用接收到
Invoke的方法,该方法的第二个参数是一个数组object,其中每个元素对应于括号中的特定参数。该关键字
params不会更改参数的数量,它只是允许在调用时将必要的参数收集到一个集合中。或者如果你直接传递一个数组,它会立即进入这个参数。
在编辑的问题中,方法
Bar完全工作。
问题只能出在调用它的错误参数中。