通过反射调用params参数的Generic方法
Invoking Generic method with params parameter through reflection
我正在尝试通过反射调用接受单个 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);
被叫class:
public class ClassWithGenericMethod
{
public bool GenericMethod<T>(params string[] input)
{
return input.Length == 1;
}
}
代码在断言之前失败,出现以下异常:
Object of type 'System.String' cannot be converted to type
'System.String[]'.
尝试用 new object[] { new[] { "param" } }
替换 new object[]{"param"}
。
这里new object[]
是参数数组,第一个参数应该是string[]
,但是在你的代码中,你使用了string
,所以异常。
当使用反射调用指定了params关键字的方法时,您应该忽略params关键字。您需要指定适当类型的数组并将其作为参数传递。
在您的情况下,您需要传递包含单个项目的字符串数组,而不是传递单个参数 "param"。
params 关键字实际上会影响方法调用程序的编译方式。当编译器发现调用的方法指定 "params" 时,它会构建适当类型的数组并将其传递。编译器 "magically" 将以下
string result = string.Concat("A","B","C","D");
基本变成下面的编译版本
string[] x = {"A", "B", "C", "D"};
string result = string.Concat(x);
我正在尝试通过反射调用接受单个 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);
被叫class:
public class ClassWithGenericMethod
{
public bool GenericMethod<T>(params string[] input)
{
return input.Length == 1;
}
}
代码在断言之前失败,出现以下异常:
Object of type 'System.String' cannot be converted to type 'System.String[]'.
尝试用 new object[] { new[] { "param" } }
替换 new object[]{"param"}
。
这里new object[]
是参数数组,第一个参数应该是string[]
,但是在你的代码中,你使用了string
,所以异常。
当使用反射调用指定了params关键字的方法时,您应该忽略params关键字。您需要指定适当类型的数组并将其作为参数传递。
在您的情况下,您需要传递包含单个项目的字符串数组,而不是传递单个参数 "param"。
params 关键字实际上会影响方法调用程序的编译方式。当编译器发现调用的方法指定 "params" 时,它会构建适当类型的数组并将其传递。编译器 "magically" 将以下
string result = string.Concat("A","B","C","D");
基本变成下面的编译版本
string[] x = {"A", "B", "C", "D"};
string result = string.Concat(x);