当通过反射调用带有参数的泛型方法时,无法将System.Int32类型的对象强制转换为System.Object []

时间:2016-11-25 07:08:05

标签: c# .net generics reflection invoke

我不是说我有一些带有两个构造函数的类(没有参数和它们):

DrawingImage

我有一些静态助手类,它们有通用的方法来调用构造函数:

public class Employee
{
    private int Salary = 0;

    public Employee()
    {
        Salary = 100;
    }

    public Employee(int newSalary)
    {
        Salary = newSalary;
    }
}

让我们假设我需要构建类的类型(在这种特殊情况下 typeof(Employee))并使用以下代码调用它的构造函数:

public static class GenericClassCreator
{
    public static T CreateClassNoParams<T>()
        where T : class, new()
    {
        return new T();
    }

    public static T CreateClassWithParams<T>(params object[] args)
        where T : class
    {
        return (T)Activator.CreateInstance(typeof(T), args);
    }
}

获取employee1(通过没有参数的构造函数)是可以的。但是获取employee2(通过带参数的构造函数)会抛出异常:

  

无法将System.Int32类型的对象强制转换为System.Object []

即使我改变了

var method1 = typeof(GenericClassCreator).GetMethod("CreateClassNoParams");
var generic1 = method1.MakeGenericMethod(typeof(Employee));

var employee1 = generic1.Invoke(null, null);


var method2 = typeof(GenericClassCreator).GetMethod("CreateClassWithParams");
var generic2 = method2.MakeGenericMethod(typeof(Employee));

var employee2 = generic2.Invoke(null, new object[] { (object)500 });

generic.Invoke(null, new object[] { (object)500 });
抛出

异常

  

无法将System.Object类型的对象强制转换为System.Object []

那么我的代码有什么问题?

3 个答案:

答案 0 :(得分:1)

您的方法期望object[]作为参数。 MethodInfo.Invoke期望包含所有参数的object[]。这意味着您需要object[]包含另一个object[]

var employee2 = generic2.Invoke(null, new object[] { new object[] { 500 } });

答案 1 :(得分:1)

令您困惑的部分是:Invoke需要一个对象数组来表示您调用的方法的参数。现在它需要该对象数组,并使用其中的值来调用该方法。

但是,您的方法本身也需要object[]才能正常工作。现在外部object[]不再存在,只有int来调用您的方法。您必须使用第二个数组包装第一个数组以符合您的方法签名。

generic2.Invoke(null, new object[] { new object[] { (object)500 } });

答案 2 :(得分:0)

试试这个 generic2.Invoke(null,new object [] {new object [] {500}});