2016-04-06 22 views
0

Siehe den folgenden Beispielcode.Wie erstellt man eine Liste <I> mit Instanzen von B, gegeben Instanzen von A (A stammt von B und B implementiert I)?

public interface I 
{ 
    int ID { get; set; } 
} 

public class B : I 
{ 
    public int ID { get; set; } 
    public string PropB { get; set; } 
} 

public class A : B 
{ 
    public string PropA { get; set; } 

    public IEnumerable<I> GetListOfBase() 
    { 
     // Attempt #1 
     var list1 = new List<I>(); 
     B b1 = this as B; 
     list1.Add(b1); 

     // Attempt #2 
     var list2 = new List<I>(); 
     B b2 = (B)this.MemberwiseClone(); 
     list2.Add(b2); 


     return list1; 
    } 
} 

private static void TestGetListOfBase() 
{ 
    var a = new A() { ID = 1, PropA = "aaa", PropB = "bbb" }; 
    var list = a.GetListOfBase(); 
} 

In beiden meinen Versuchen, die Liste enthält Instanzen von A muß ich es Instanzen von B zu I enthält, ein neues B zu vermeiden, versuchen die Schaffung dann von A Kopieren die Eigenschaften zu B (Ich gehe davon aus, dass wird funktionieren!).

EDIT: Der Grund, warum ich eine Liste von Bs brauche, ist, dass später jedes B in NPOco (ein .NET-Mikro-ORM, abgeleitet von PetaPoco) übergeben wird. NPoco übernimmt den Namen des Typs und ermittelt daraus die zuzuordnende DB-Tabelle. Daher ist es von entscheidender Bedeutung, dass eine Variable vom richtigen Typ an die Methode übergeben wird.

+0

Mögliches Duplikat von [Liste umwandeln in Liste ] (http://stackoverflow.com/questions/1817300/convert-listderivedclass-to-listbaseclass) –

+1

Da A von B abgeleitet ist, ist jede Instanz von A ein Instanz von B. Überall können Sie ein B, y verwenden Sie können auch ein A verwenden. Können Sie erklären, warum Sie eine Liste von Bs erstellen müssen? –

+0

Es ist so, dass ich die Liste in NPOco übergeben kann (ein .NET-Mikro-ORM, abgeleitet von PetaPoco). NPoco übernimmt den Namen des Typs und ermittelt daraus die zuzuordnende DB-Tabelle. Daher ist es von entscheidender Bedeutung, dass eine Variable vom richtigen Typ an die Methode übergeben wird. – Laurence

Antwort

1

Nein, es gibt keine Möglichkeit, die Instanz der abgeleiteten Klasse in die Instanz der Basisklasse zu konvertieren. Sie müssen neue Instanzen der Basisklasse erstellen und Eigenschaften kopieren.

Es gibt mehrere Möglichkeiten, dies zu tun, einschließlich des manuellen Kopierens jeder Eigenschaft (funktioniert für eine kleine Anzahl von Eigenschaften). Diese Operation wird häufig als "Mapping" bezeichnet (hoffentlich hilft es bei der Suche nach Werkzeugen).

Hinweis, wenn es Ihnen gut geht, nur mit anderen Typen für die Liste Enumerable.OfType<T>() oder Enumerable.Cast<T>() gefolgt von ToList() würde es in einzelnen Anweisung lösen.

+0

Die Liste muss List sein, wobei I die Schnittstelle ist. Ich denke, ich werde eine Kartierungstechnik verwenden müssen. – Laurence

+0

@Laurence Ist Ihr Ziel, A vor Anrufern zu verbergen? Proxy 'ProxyI', der alle Methoden der Schnittstelle' I' implementiert, indem er zum eigentlichen 'A' Objekt' innerA' weiterleitet, könnte die bessere Option sein. –

+0

(Verpasster Kommentar zum Post - klar Proxy ist falscher Ansatz, falls ein exakter Typ benötigt wird). –

0

können Sie verwenden eine copy constructor zu leicht Instanzen vom Typ B eine Instanz vom Typ A gegeben (oder irgendetwas, das zu B zugeordnet werden kann):

public class B : I 
{ 
    public int ID { get; set; } 
    public string PropB { get; set; } 

    public B(source B) 
    { 
     // copy values 
     this.ID = source.ID; 
     this.PropB = source.PropB; 
    } 
} 

Sie können es so nennen:

A instanceOfA = new A(); 
B instanceOfB = new B(instanceOfA); 
// typeof(instanceOfB) == B