我正在尝试使用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中是可能的吗?或者如何用这样的参数类型实例化类型?
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());