using System.Collections.Generic;
public string MyString {get;}
public List<T> MyObjects {get;}
protected MyType (int myInt, string myString, params T[] myObjects) {
MyObjects = myObjects?.ToList() ?? new List<T>();
public override string ToString()
return $"{MyInt:N0}; {MyString}; {string.Join(", ", MyObjects)}";
public static void Main()
var intItem = CreateGeneric<int> (1, "int_str", null);
Console.WriteLine(intItem);
var strItem = CreateGeneric<string> (2, "str_str", null);
Console.WriteLine(strItem);
strItem = CreateGeneric (3, "str_str", new[]{ "a", "b", "c"});
Console.WriteLine(strItem);
public static MyType<T> CreateGeneric<T>(int myInt, string myString, T[] array)
var types = new [] { typeof(int), typeof(string), typeof(T[])};
var args = new object[] { myInt, myString, array };
var ctor = typeof(MyType<T>).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic, null, types, null);
var item = (MyType<T>)ctor.Invoke(args);