通过反射调用带有参数参数的泛型方法

本文关键字:参数 泛型方法 反射 调用 | 更新日期: 2023-09-27 18:34:33

我正在尝试调用一个通过反射接受单个参数参数的通用方法。当我选择它是非通用的时,传递一个 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[]"。

通过反射调用带有参数参数的泛型方法

尝试用

new object[] { new[] { "param" } }填充new object[]{"param"}

这里new object[]是参数数组,第一个参数应该是string[],但是在您的代码中,您使用string,因此例外。

使用反射调用指定了 params 关键字的方法时,应忽略 params 关键字。 您需要指定适当类型的数组并将其作为参数传递。

在您的情况下,您需要传递一个包含单个项目的字符串数组,而不是传递"param"的单个参数。

params 关键字实际上会影响方法调用方的编译方式。 当编译器看到被调用的方法指定了"params"时,它会构建适当类型的数组并传递它。 编译器"神奇地"转动以下内容

string result = string.Concat("A","B","C","D");

基本上是以下的编译版本

string[] x = {"A", "B", "C", "D"};
string result = string.Concat(x);