将通用参数数组设置为 null 的激活类型
Activate type with generic params array set to null
假设我有这个 ctor:
public MyType<T>(int myInt, string myString, params T[] myObjects) { }
我可以将 params 数组本身设置为 null
(而不是将 null 传递给数组):
MyType(1, "foo", (T[])null)
假设我想动态地执行此操作。我试过这个:
var args = new object[] { 1, "foo", null };
var myType = Activator.CreateInstance(typeof(MyType), BindingFlags.Instance | BindingFlags.NonPublic, null, args, null);
但这会引发 MissingMethodException
。
如果我将 ctor 的 params T[]
更改为 params object[]
那么它就可以工作,但我更愿意保留通用形式。
我该怎么做?
Activator.CreateInstance
似乎是一种方便包装 Type.GetConstructor
。后者的优点是您可以明确指定 ctor 的签名,这将在这种情况下帮助您:
//usage:
var intItem = CreateGeneric<int> (1, "int_str", null);
var strItem = CreateGeneric<string> (2, "str_str", null);
public static MyType<T> CreateGeneric<T>(int myInt, string myString, T[] array)
{
//specify c'tor signature and get ctor-info
var types = new [] { typeof(int), typeof(string), typeof(T[])};
var ctor = typeof(MyType<T>).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic, null, types, null);
//create instance
var args = new object[] { myInt, myString, array };
var instance = (MyType<T>)ctor.Invoke(args);
return instance;
}
假设我有这个 ctor:
public MyType<T>(int myInt, string myString, params T[] myObjects) { }
我可以将 params 数组本身设置为 null
(而不是将 null 传递给数组):
MyType(1, "foo", (T[])null)
假设我想动态地执行此操作。我试过这个:
var args = new object[] { 1, "foo", null };
var myType = Activator.CreateInstance(typeof(MyType), BindingFlags.Instance | BindingFlags.NonPublic, null, args, null);
但这会引发 MissingMethodException
。
如果我将 ctor 的 params T[]
更改为 params object[]
那么它就可以工作,但我更愿意保留通用形式。
我该怎么做?
Activator.CreateInstance
似乎是一种方便包装 Type.GetConstructor
。后者的优点是您可以明确指定 ctor 的签名,这将在这种情况下帮助您:
//usage:
var intItem = CreateGeneric<int> (1, "int_str", null);
var strItem = CreateGeneric<string> (2, "str_str", null);
public static MyType<T> CreateGeneric<T>(int myInt, string myString, T[] array)
{
//specify c'tor signature and get ctor-info
var types = new [] { typeof(int), typeof(string), typeof(T[])};
var ctor = typeof(MyType<T>).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic, null, types, null);
//create instance
var args = new object[] { myInt, myString, array };
var instance = (MyType<T>)ctor.Invoke(args);
return instance;
}