2016-11-15 1 views
1

ich eine Funktion geschrieben haben, die eine generische IEnumerable nehmen und diese Objekte abbilden (wenn möglich) auf Objekte I für einen Algorithmus verwendet werden soll. Ich habe nicht viel Erfahrung mit generischen Objekten oder IEnumberables, also wollte ich um Rat fragen.Arbeiten mit generischen IEnumerable <T>

Ich habe diesen Code geschrieben:

public static IEnumerable<OtherObject> MyObjectToOtherObject<T>(IEnumerable<T> objects) 
    { 
     if (objects.GetType() == typeof(MyObject)) 
     { 
      var data = (IEnumerable<MyObject>)objects; 
      return data.Select(x => new OtherObject() { // Map the attributes }); 
     } 
     else 
      return null; 
    } 

Dies gilt nicht in meinem Code arbeiten, da es null zurück, obwohl die Eingangsliste des MyObject Typ ist. Ich kann einfach nicht herausfinden, wie ich meine IEnumerable<T> zu IEnumerable<MyObject> zu werfen. Gibt es etwas, was ich falsch mache?

Vielen Dank im Voraus!

Ich bin für die ganze Verwirrung leid. Ich habe das falsch gefragt. Alex hat mir genug geholfen, danke!

+0

Verwenden objects.OfType () mit .Select (x => new Object1() ...)) – Evk

+0

von 'Object' meinen Sie das in Wurzel aller gebaut Objekte oder deine eigene Klasse? Wenn Letzteres, wähle einen besseren Namen !! – Jamiec

+0

'IEnumerable ' ist kovariant, also was versuchen Sie zu tun, außer 'IEnumerable Ergebnis = Objekte;'? – grek40

Antwort

1

dies falsch ist.

objects.GetType() == typeof(MyObject) 

Richtig:

objects.GetType() == typeof(IEnumerable<T>) 

Wenn benötigen Sie Art von verschachtelten Elementen vergleichen:

objects.GetType().GetGenericArguments()[0] == typeof(MyObject) 
typeof(T) == typeof(MyObject) 

Wenn Sie überprüft werden, wenn der Typ in einem anderen Typ gegossen werden kann:

objects.GetType().GetGenericArguments()[0].IsAssignableFrom(typeof(MyObject)) 

oder einfach nur als

typeof(T).IsAssignableFrom(typeof(MyObject)) 
+0

Ich fand einen Fehler in meinem Code.I gab die Funktion eine Liste . Was muss ich tun, damit der Typ der Objekte in der Liste anstelle des Typs von IEnumerable überprüft wird? – RandomStranger

+0

Vielen Dank für Ihre Bearbeitung! Entschuldigen Sie, dass ich solch eine verwirrende Frage gestellt habe! – RandomStranger

0

Sieht wie Sie nicht eine generische Methode benötigen, wenn Sie die Quell- und Zieltypen immer wissen, können Sie dies tun:

public static IEnumerable<DestObject> ObjectToObject1(IEnumerable<SourceObject> objects) 
{     
    return data.Select(x => new DestObject() { // Map the attributes }); 

} 
+0

Korrekte, ich werde später weitere Typen hinzufügen.Es gibt noch nicht einmal die if-Anweisung – RandomStranger

0

denke ich, was Sie versuchen, eine generische Mapping-Methode zu tun bauen, die Object1 jeder geben T auf Ihre konkrete Klasse zuordnen. Sie müssen eine Zuordnungsfunktion bereitstellen, die das Mapping durchführt.

Sagen Sie bitte diese (allzu gekünstelt) Beispiel haben:

public class SourceObject 
{ 
    public string AString{get;set;} 
} 

public class DestObject 
{ 
    public string TheProperty{get;set;} 
} 

Und Sie beginnen mit einem IEnumerable<SourceObject> Ihre Methode, um die Liste zu nehmen brauchen würde, und eine Func<SourceObject,DestObject> das Mapping

var input = new List<SourceObject>(){ 
    new SourceObject{AString="Str1"}, 
    new SourceObject{AString="Str2"} 
}; 

var result = MyObjectToOtherObject(input, x => new DestObject{TheProperty = x.AString}); 

zu tun Dies wird wie folgt erreicht:

public static IEnumerable<DestObject> MyObjectToOtherObject<T>(IEnumerable<T> objects, Func<T,DestObject> mapping) 
{ 
    return data.Select(mapping); 
} 

Wie Sie sehen können, die separaten Methode ist zu diesem Zeitpunkt mehr oder weniger nutzlos. Es ist genau das, was Select tut.

0

objects nie Art sein MyObject daher

(objects.GetType() == typeof(MyObject)) 

immer false zurück, weil object einige generische Sammlung (IEnumerable<T>).

Sie könnten versuchen

typeof(T) == typeof(MyObject) 
Verwandte Themen