通过反射调用带有params参数的Generic方法

时间:2016-02-15 08:10:17

标签: c# generics reflection invoke params

我正在尝试通过反射调用接受单个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 []'。

2 个答案:

答案 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);