У меня есть следующие классы:общий тип класса собственности
BaseField:
public abstract class BaseField {
...
public BaseField()
{
}
public BaseField(E_FieldType fieldType)
{
_FieldType = fieldType;
}
}
TextField:
public class TextField : BaseField {
...
public TextField() : base(E_FieldType.Text)
{
}
}
DateField:
public class DateField : BaseField {
...
public DateField() : base(E_FieldType.Date)
{
}
}
И Блок Данных класс, который должен содержать TextField или DateField:
public class DataBlock<T> : BaseBlock where T : BaseField, new() {
...
private T _Field;
public DataBlock(string name): base(name, E_BlockType.Data)
{
_Field = new T();
}
}
Следующая строка работает отлично:
DataBlock<TextField> db = new DataBlock<TextField>("qwe");
Но это не возможно, чтобы написать этот код :
public ObservableCollection<DataBlock<BaseField>> DataBlockList { get; set; }
public DataBlockViewModel()
{
DataBlockList = new ObservableCollection<DataBlock<BaseField>>();
DataBlockList.Add(new DataBlock<TextField>("qwe"));
DataBlockList.Add(new DataBlock<DateField>("asd"));
}
Ошибка:
'BaseField' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method
'DataBlock<T>'
Не могли бы вы посоветовать, как решить этот вопрос, что я могу создать ObservableCollection<DataBlock<BaseField>>
коллекцию?
можно удалить new()
из public class DataBlock<T> : BaseBlock where T : BaseField
и
public DataBlock(string name): base(name, E_BlockType.Data)
{
//_Field = new T();
}
В этом случае я могу создать DataBlockList = new ObservableCollection<DataBlock<BaseField>>();
, но это не возможно, чтобы написать:
DataBlockList.Add(new DataBlock<TextField>("qwe"));
DataBlockList.Add(new DataBlock<DateField>("asd"));
Рассмотреть вопрос о том, почему не абстрактный тип «BaseField» с открытым конструктором без параметров »не является вариантом. –