【问题标题】:Unable to cast object of type System.Int32 to System.Object[] when calling generic method with parameters via reflection通过反射调用带有参数的泛型方法时,无法将 System.Int32 类型的对象转换为 System.Object[]
【发布时间】:2016-11-25 07:08:04
【问题描述】:

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

public class Employee
{
    private int Salary = 0;

    public Employee()
    {
        Salary = 100;
    }

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

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

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);
    }
}

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

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 });

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

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

即使我改变了

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

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

抛出异常

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

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

【问题讨论】:

    标签: c# .net generics reflection invoke


    【解决方案1】:

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

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

    【讨论】:

    • 哦.. object[] 包含另一个 object[] - 这真是令人困惑:)。谢谢。
    【解决方案2】:

    让您感到困惑的部分是:Invoke 需要一个对象数组来存储您调用的方法的参数。现在它获取该对象数组,并使用其中的值来调用方法。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2020-01-28
        • 2013-07-10
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多