我正在尝试使用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吗?或者如何实例化具有这种参数类型的类型?
答案 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());