Вы не можете сделать это в C #. Это хорошо, так как мы не хотим, чтобы конструкторы не соответствовали классу. Но все же есть несколько способов достичь своей цели.
Самый простой способ (если вы используете C # 4), это использовать IEnumerable вместо ICollection, потому что IEnumerable поддерживает контрастность.
public class MyClass
{
private List<SomeSupertype> myList;
public MyClass (IEnumerable<SomeSuperType> elements)
{
myList = new List<SomeSuperType> ();
foreach (SomeSupertype element in elements) {
myList.Add (element);
}
}
}
Теперь вы можете вызывать конструктор, не задумываясь о приведении коллекции производных типов к коллекции базовых типов.
List<SomeDerivedClass> col = new List<SomeDerivedType>();
MyClass obj1 = new MyClass(col)
Второе решение, вы можете просто вызвать ваш конструктор, приведя коллекцию с использованием LINQ.
MyClass obj1 = new MyClass(col.Cast<SomeSuperClass>());
Третье решение, вы можете создать статический универсальный метод для создания новых объектов вашего класса.
public static MyClass Construct<T>(ICollection<T> elements) where T : ClassA
{
return new MyClass(elements.Cast<ClassA>().ToArray());
}
В-четвертых, вы можете создать универсальный класс, производный от вашего базового класса, как кто-то уже указал.