2016-04-21 13 views
-1

Ich habe eine abstrakte KlasseIch will nicht Gussverfahren

public abstract ElementInfo : IElementMap, ISection 

Ich habe eine Methode verwenden, die Argumente des Typs Liste akzeptiert < IElementMap>

public static IDictionary<int,int> GetOneToOneMap(List<IElementMap> abc, List<IElementMap> xyz,double asd) 

Jetzt habe ich eine eine Liste Aufgabe Typ ElementInfo

List<ElementInfo> analyinfo; 

wenn ich die Methode GetOneToOneMap nenne ich bin derzeit das Senden der ersten Argument wie analyinfo.Cast<IElementMap>, aber ich möchte nicht verwenden .Cast

Was sind bessere Möglichkeiten, dies zu tun?

+0

http://automapper.org/ - „Eine Konvention basierte Objekt-Objekt-Mapper 100% Bio-und glutenfrei nimmt alle.. von dem Aufwand, ein Objekt auf ein anderes zu übertragen. " –

+3

_ "Ich möchte nicht' .Cast' "_ Warum nicht - es scheint die richtige Lösung zu sein? Wenn Sie erklären können, warum Sie es nicht verwenden möchten, kann Ihnen vielleicht jemand eine bessere Alternative vorschlagen, die Ihren Bedürfnissen entspricht. –

+0

Eine 'Liste ' _ist nicht_ eine 'Liste ', sonst könnten Sie andere Implementierungen hinzufügen. Sie müssen entweder jedes Element in einen neuen Sammlungstyp umwandeln oder die Parametertypen in 'IEnumerable ' ändern, was kovariant ist. –

Antwort

0

Wenn Sie die Art von abc und xyz Parameter IEnumerable<IElementMap> ändern können, dann können Sie einen List<ElementInfo> als Parameter übergeben. Dies ist möglich, da IEnumerable<T> in T kovariant ist.

Etwas wie folgt aus:

public static IDictionary<int,int> GetOneToOneMap(IEnumerable<IElementMap> abc, 
                IEnumerable<IElementMap> xyz, 
                double asd) 
{ 
    ... 
} 

dann so ein Anruf möglich:

List<ElementInfo> list1 = ...; 
List<ElementInfo> list2 = ...; 

GetOneToOneMap(list1, list2, 123); 

Eine andere Lösung wäre Generika verwenden, etwa so:

public static IDictionary<int, int> GetOneToOneMap<T>(IEnumerable<T> abc, 
                 IEnumerable<T> xyz, 
                 double asd) where T : IElementMap 
+0

Irgendein Grund für das Downvote? –

0

Ihre Liste könnte vom Typ IElementMap und hinzugefügte Elemente können vom Typ ElementInfo sein.

List<IElementMap> analyinfo=new List<IElementMap> {objects of ElementInfo}; 

Auf diese Weise müssen Sie nicht Analyseinfo während der Übergabe an GetOneToOneMap-Methode zu werfen.

+2

Das ist im Grunde das Gleiche wie 'Cast(). ToList()'. –

-1

Vielleicht Enumerable.OfType ist dein Freund (https://msdn.microsoft.com/de-de/library/bb360913(v=vs.110).aspx)

+1

Das funktioniert im Prinzip genauso wie "Cast", wenn alle Elemente vom Zieltyp sind. –

+0

Sicher ist es im Grunde das gleiche, aber der Vorteil ist OfType wird die Objekte für Sie gefiltert, die den Parameter entsprechen. Andernfalls sollten Sie overide verwenden, um Servval-Parametertypen auszuführen. – Flo

Verwandte Themen