2015-09-30 2 views
0

У меня есть следующие классы:общий тип класса собственности

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")); 
+3

Рассмотреть вопрос о том, почему не абстрактный тип «BaseField» с открытым конструктором без параметров »не является вариантом. –

ответ

1

Есть 2 способа получить устраняют ошибку:

1) Вы можете сделать класс BaseField неабстрактного

public abstract class BaseField { 
    ... 
    public BaseField() 
    { 

    } 

    public BaseField(E_FieldType fieldType) 
    { 
     _FieldType = fieldType; 
    } 
} 

2) Передать новый объект BaseField в качестве параметра конструктора, чтобы DataBlock и удалить new() ограничения.

public class DataBlock<T> : BaseBlock where T : BaseField { 
    ... 
    private T _Field; 
    public DataBlock(string name, T field): base(name, E_BlockType.Data) 
    { 
     _Field = field;    
    } 
} 
+0

Спасибо! Думаю, второй способ мне подходит :) –

Смежные вопросы