Я переписал ваш код в виде примера (надеюсь, это соответствует тому, что вы пытаетесь сделать! =), Чтобы попытаться прояснить, в чем проблема:
public class Program
{
public struct MyType
{
public ICollection<string> MyProperty { get; set; }
}
static void Main(string[] args)
{
var type = typeof(MyType);
var properties = type.GetProperties();
var destProperty = properties[0];
var genericTypeDefinition = destProperty.PropertyType.GetGenericTypeDefinition();
var madeGenericType = genericTypeDefinition.MakeGenericType(destProperty.PropertyType.GetGenericArguments());
var ctor = madeGenericType.GetConstructor(Type.EmptyTypes);
}
}
Если вы установите точку останова на предпоследней фигурной скобке, вы увидите, что ctor
возвращается как null
, потому что, как вы правильно поняли, ICollection<T>
не имеет конструкторов, поскольку он являетсяinterface.
Из-за этого не существует «супер-универсального» способа сделать это, потому что нет никакого внутреннего способа сказать «какая лучшая реализация ICollection<T>
для использования в этой ситуации».Вам нужно будет принять это решение и new
одно, основываясь на информации, которую вы получите от размышлений.