使用params参数调用构造函数的Activator

时间:2014-03-19 14:51:12

标签: c# reflection params activator

我正在尝试使用Activator的反射魔法来实例化一个类型。不幸的是,我想要实例化的类型有一个类型为params的{​​{1}}参数。见这个摘录:

object

实例化在这里:

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

甚至可以使用Activator吗?或者如何实例化具有这种参数类型的类型?

2 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,听起来您似乎没有调用params重载。

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

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

答案 1 :(得分:1)

你可以传递这样的参数:

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