我正在尝试通过反射调用接受单个params参数的泛型方法。 当我选择它是非泛型的时,传递一个object []项似乎已经足够了,但是当我需要调用泛型方法时它就不再起作用了。
var type = typeof (ClassWithGenericMethod);
var method = type.GetMethod("GenericMethod", BindingFlags.Instance | BindingFlags.Public);
var genericMethod = method.MakeGenericMethod(typeof(object));
var result = (bool)genericMethod.Invoke(new ClassWithGenericMethod(), new object[]{"param"});
Assert.IsTrue(result);
被叫班级:
public class ClassWithGenericMethod
{
public bool GenericMethod<T>(params string[] input)
{
return input.Length == 1;
}
}
代码在断言之前失败,但有以下异常:
'System.String'类型的对象无法转换为类型 'System.String []'。
答案 0 :(得分:5)
尝试使用new object[]{"param"}
充实new object[] { new[] { "param" } }
。
此处new object[]
是参数数组,第一个参数应为string[]
,但在您的代码中,您使用string
,因此例外。
答案 1 :(得分:0)
当使用反射来调用指定了params关键字的方法时,您应该忽略params关键字。您需要指定适当类型的数组并将其作为参数传递。
在您的情况下,您需要传递包含单个项目的字符串数组,而不是传递&#34; param&#34;的单个参数。
params关键字实际上影响方法调用者的编译方式。当编译器发现被调用的方法指定&#34; params&#34;时,它会构建适当类型的数组并传递它。编译器&#34;神奇地&#34;转为以下
string result = string.Concat("A","B","C","D");
基本上是以下
的编译版本string[] x = {"A", "B", "C", "D"};
string result = string.Concat(x);