c# - generic type of class property -
i have following classes:
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) { } } and datablock class should contain textfield or datefield:
public class datablock<t> : baseblock t : basefield, new() { ... private t _field; public datablock(string name): base(name, e_blocktype.data) { _field = new t(); } } the following line works fine:
datablock<textfield> db = new datablock<textfield>("qwe"); but not possible write code:
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")); } the error is:
'basefield' must non-abstract type public parameterless constructor in order use parameter 't' in generic type or method
'datablock<t>'
could please advise how solve issue can create observablecollection<datablock<basefield>> collection?
i can remove new() public class datablock<t> : baseblock t : basefield and
public datablock(string name): base(name, e_blocktype.data) { //_field = new t(); } in case can create datablocklist = new observablecollection<datablock<basefield>>();
but not possible write:
datablocklist.add(new datablock<textfield>("qwe")); datablocklist.add(new datablock<datefield>("asd"));
there 2 ways rid of error:
1) can make class basefield non-abstract
public abstract class basefield { ... public basefield() { } public basefield(e_fieldtype fieldtype) { _fieldtype = fieldtype; } } 2) pass new basefield object constructor parameter datablock , remove new() constraint.
public class datablock<t> : baseblock t : basefield { ... private t _field; public datablock(string name, t field): base(name, e_blocktype.data) { _field = field; } }
Comments
Post a Comment