c# - Cast Parent class to Child -
we have observablecollection<t>
of 6 observablecollection list<parent>
have different types of child classes.
what use generic method retrieve objects have same type, in other words retrieve list contains <t>
children.
here source code
classes , b child classes of parent.
observablecollection<managertemplate> managerliststack = new observablecollection<managertemplate>(managertemplates); class managertemplate { public type _type { get; set; } public observablecollection<parents> parentlist {get;set;} } internal static list<managertemplate> managertemplates = new list<managertemplate>() { new managertemplate{ list= new observablecollection<parent>(),type=typeof(a)}, new managertemplate{ list= new observablecollection<parent>(),type=typeof(b)} }; public static list<t> get<t>() t : parent { /*(managerliststack.where(x => x._type == typeof(t)).first().list.cast<t>()).tolist(); -- try 1*/ /*(list<t>)(managerliststack.where(x => x._type == typeof(t)).first().list.cast<t>())* -- try 2*/ return (managerliststack.where(x => x._type == typeof(t)).first().list.cast<t>()).tolist(); }
using
(managerliststack.where(x => x._type == typeof(t)).first().list list<t>)
the returned list contains no elements.i 100% sure , have debugged list, , there elements inside.
using
(list<t>)(managerliststack.where(x => x._type == typeof(t)).first().list.cast<t>())
i error 'unable cast parent or b'
somelistofx list<y>
never work. fact y
derives x
not mean list<y>
derives list<x>
! these 2 list types not compatible; 2 different types.
a list<parent>
cannot cast list<child>
, if contains items of type child
because c# knows static types when compiles, not runtime types. list contain items not of type child
.
by way, opposite doesn't work either. because if able cast list<child>
list<parent>
, add item of type parent
or anotherchild
list<parent>
, since underlying list still of type list<child>
f*** up! note, casting object not create new object (i.e. not transform object), tells c# consider being type. e.g. can child child = (child)parent;
if know parent
references child.
in
(list<t>)(managerliststack.where(x => x._type == typeof(t)).first().list.cast<t>())
cast<t>
yields ienumerable<t>
, cannot cast ienumerable<t>
list<t>
! enumerable not list.
what works is
list<y> listofy = listofx.cast<y>().tolist();
if x
can cast y
.
your third (uncommented) example in get<t>
works:
return managerliststack .where(x => x._type == typeof(t)) .first().list .cast<t>() .tolist();
Comments
Post a Comment