2017-09-10 1 views
-1

Kann jemand erklären, was in den folgenden Code geschieht:Erklärung von .net Code

private IList<SomeModel> ImportSomething<T>(IEnumerable<ISomeInterface> someResponse, Func<ISomeInterface, Conversion<T>> converter) => someResponse 
    .Select(converter) 
    .Where(conversion => conversion.Status == ConversionStatus.Success) 
    .Select(conversion => conversion.Object) 
    .Cast<SomeModel>() 
    .ToList(); 

Der obige Code wird aufgerufen durch:

ImportSomething(collectionOfThings, _thingConverter.FromXmlResponse) 

Antwort

1

Sie haben eine generische Methode, deren Signatur ist folgende:

private IList<SomeModel> ImportSomething<T>(
    IEnumerable<ISomeInterface> someResponse 
    , Func<ISomeInterface, Conversion<T>> converter) 

Diese Methode zwei Argumente hat. Die erste ist eine Sequenz von ISomeInterface Objekten. Der zweite ist ein Func, der als Eingabe ein Objekt verwendet, das die Schnittstelle ISomeInterface implementiert und ein Objekt vom Typ Conversion<T> zurückgibt. Im Wesentlichen ist es eine Methode, die die Eingabe eines Objekts, das die Schnittstelle ISomeInterface implementiert, in ein Objekt vom Typ Conversion<T> konvertiert.

Dann für einen gegebenen Eingang, der als someResponse bezeichnet wird einige Transformationen angewendet.

Erstens, für jedes Element in der Sequenz someResponse die converter angewendet wird:

someResponse.Select(converter) 

Auf diese Weise alle ISomeInterface Objekte in dieser Reihenfolge Conversion<T> zu Objekten des Typs umgewandelt werden würde.

Dann werden die Elemente, die würden umgewandelt werden fehlgeschlagen herausgefiltert und eine neue Sequenz würde mit den Objekten erstellt werden, die erfolgreich umgesetzt wurden:

Where(conversion => conversion.Status == ConversionStatus.Success) 

Danach ein Vorsprung hergestellt ist und von den Conversion<T> Objekte wir haben wir nur die Object Eigentum:

Select(conversion => conversion.Object) 

Letzte wir werfen jedes Element in unserer Sequenz zu einem SomeModel Objekt und wir fordern die sofortige Ausführung unserer Abfrage durch dieAufrufMethode.

Das Ergebnis der ausgeführten Abfrage wäre ein List<SomeModel> Objekte.

Die oben genannten Schritte können genauer sein, wenn Sie ein konkretes Beispiel als eine haben Sie erwähnt:

ImportSomething(collectionOfThings, _thingConverter.FromXmlResponse) 

nun die Reihenfolge der Objekte auf dem alle oben angewandt würde das collectionOfThings Objekt und der Wandler das wäre der _thingConverter.FromXmlResponse. Es ist nicht erforderlich, dass Sie T angeben, da der Compiler daraus den Typ _thingConverter.FromXmlResponse ableiten kann.

1

Nicht das, was tatsächlich passiert, aber logische Idee ist die gleiche .

var result = new List<SomeModel>(); 

foreach (var response in someResponse) 
{ 
    // Select(converter) 
    var conversion = converter(response); 

    // Where(conversion => conversion.Status == ConversionStatus.Success) 
    if (conversion.Status == ConversionStatus.Success) 
    { 
     // Select(conversion => conversion.Object) 
     var value = conversion.Object; 

     // Cast<SomeModel>() 
     var model = (SomeModel)value; 

     result.Add(model); 
    } 
} 

return result;