2017-05-21 5 views
0

Ich habe zwei Klassen, eine davon ist von anderen abgeleitet.Liste kopieren <BaseList> zu Liste <DerivedList> mit überschreiben Eigenschaften C#

public class BaseClass 
{ 
    private int iD; 
    private string name; 
    private int typeID; 

    public int ID { get => iD; set => iD = value; } 
    public string Name { get => name; set => name = value; } 
    public virtual int TypeID { get => typeID; set => typeID = value; } 
} 
public class DerivedClass : BaseClass 
{ 
    private int typeID; 
    private string typeName; 
    private Types types; // This is a list of some other objects to lookup; 

    public DerivedClass(Types types) 
    { 
     this.types = types; 
    } 

    public override int TypeID 
    { 
     get => typeID; 
     set 
     { 
      typeID = value; 
      typeName = types.Where(o => o.ID == value).FirstOrDefault().Name; 
     } 
    } 
    public string TypeName { get => typeName; } 
} 
public class Type 
{ 
    public int ID; 
    public string Name; 
} 
public class Types : List<Type> { }; 

List<BaseClass> baseClassList = new List<BaseClass>(); 
baseClassList.Add(new BaseClass() {ID = 1, Name = "aaa", TypeID = 1}); 
baseClassList.Add(new BaseClass() { ID = 2, Name = "bbb", TypeID = 1 }); 

Types typeList = new Types(); 
typeList.Add(new Type() { ID = 1, Name = "LookupName" }); 

Ist es möglich Liste der BaseClass kopieren zur Liste DerivedClass ohne alle Objekte in der Liste aufzählt (ich meine, ohne foreach Klausel)?

Code zum Erstellen von Objekten hinzugefügt.

+1

"? Ohne alle Objekte in der Liste aufzählt" - no – HimBromBeere

+0

Ihre Liste enthält nur Instanzen von 'BaseClass'. Der Versuch, diese auf "DerivedClass" zu übertragen, schlägt fehl, weil sie keine Instanzen von "DerivedClass" sind. – Kyle

Antwort

0

Wenn Sie sicher, dass alle Listenmitglieder des Typs sind DerivedClass Sie Cast Methode der Liste versuchen:

List<BaseClass> baseList = new List<BaseClass>(); 

//Add some DerivedClass 
baseList.Add(new DerivedClass()); 
baseList.Add(new DerivedClass()); 

List<DerivedClass> derivedList = baseList.Cast<DerivedClass>().ToList(); 

EDIT: wenn Listenelemente vom Typ sind BaseClass dann können Sie werfen sie nicht, aber sie können wandeln sie in DerivedClass auf diese Weise:

ein contructor für DerivedClass erstellen, die eine BaseClass

akzeptiert
public DerivedClass(BaseClass baseClass) 
{ 
    this.typeID = baseClass.TypeID; 

    this.typeName = baseClass.Name; 

    //and ... 
} 

Dann:

List<BaseClass> baseList = new List<BaseClass>(); 

//Add some DerivedClass 
baseList.Add(new BaseClass()); 

List<DerivedClass> derivedList = baseList.Select(i => new DerivedClass(i)).ToList(); 
+1

Es könnte besser sein, 'OfType ()' anstelle von 'Cast ()' zu verwenden, da dies auch Situationen betrifft, in denen nicht alle Listenmitglieder vom Typ DerivedClass sind; es sei denn, das mögliche Ausnahmewerfen von Cast () ist im Anwendungsszenario erwünscht ... – elgonzo

+0

@elgonzo ja, wenn wir diese 'DerivedClass' aus der Liste holen wollen,' OfType' ist eine bessere Lösung, aber was, wenn wir alle erwarten Elemente sind 'DerivedClass'? In diesem Fall möchten wir vielleicht (mit Ausnahme) benachrichtigt werden, dass jedes Element nicht "DerivedClass" ist. –

+0

Cast oder OfType oder ConvertAll funktionieren in diesem Fall nicht, da ein Typ nicht direkt in andere konvertiert werden kann. – kord

Verwandte Themen