调用Activator来获取带参数的构造函数

本文关键字:参数 构造函数 获取 Activator 调用 | 更新日期: 2023-09-27 17:51:06

我正在尝试使用Activator的反射魔法实例化类型。不幸的是,我想实例化的类型有一个object类型的params参数。请看节选:

public class Foo
{
    public Foo(string name, params object[] arguments)
    {
    }
}

实例化在这里:

public static class Bar
{
    public static object Create(params object[] arguments)
    {
        return Activator.CreateInstance(typeof(Foo), "foo", arguments);
    }
}
现在,这有效地导致了一个签名为 的构造函数调用。
new Foo(string, object[])

,因为object[]也是object

我真正想要的是:

new Foo(string, object, object, object, ...)

这在Activator中是可能的吗?或者如何用这样的参数类型实例化类型?

调用Activator来获取带参数的构造函数

params是一个纯编译时语法糖。
运行时,包括反射使用的参数绑定,会忽略它。

你需要传递一个普通的数组,就像一个非params参数。

在您的情况下,听起来您试图不调用params过载。

您需要构建一个包含您想要传递的所有参数的单一(扁平)数组:

object[] args = new object[arguments.Length + 1];
args[0] = "foo";
arguments.CopyTo(args, 1);

你可以这样传递参数:

return Activator.CreateInstance(
    typeof(Foo),
    new object[] { "foo" }.Concat(arguments).ToArray());