通过反射调用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);