将通用参数数组设置为 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;
}

完整演示:https://dotnetfiddle.net/h3lpZc