2015-09-30 113 views
0

我有以下类别:泛型类属性的

BaseField:

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

    } 

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

文本字段:

public class TextField : BaseField { 
    ... 
    public TextField() : base(E_FieldType.Text) 
    { 

    } 
} 

的DateField:

public class DateField : BaseField { 
    ... 
    public DateField() : base(E_FieldType.Date) 
    { 

    } 
} 

而且数据块类应包含文本字段的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>>收集的问题?

我才能把public class DataBlock<T> : BaseBlock where T : BaseFieldnew()

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

谢谢!我认为,第二种方式适合我:) –