2010-12-31 3 views
-1

Ich habe eine benutzerdefinierte Unterklasse von BindingList <T>, die ich eine LINQ-Abfrage über die praktischen Erweiterungsmethoden ausführen möchten. Zum Beispiel:Wie kann ich IEnumerable <T> Erweiterungs-Methoden auf meiner benutzerdefinierten Unterklasse BindingList <T> zugreifen?

public int GetSum(MyList<T> list) 
{ 
    return list.Sum(x => x.Value); 
} 

Aber der Compiler beschwert sich, dass es nicht Sum auflösen kann, weil es nicht list als IEnumerable<T> zu erkennen ist, ist es, die offensichtlich ist, denn dies funktioniert:

public int GetSum(MyList<T> list) 
{ 
    return ((IEnumerable<T>)list).Sum(x => x.Value); 
} 

Jedermann haben Auf geschickte Weise kann ich die hässliche und unnötige Besetzung vermeiden?

Antwort

1

Es scheint, der Compiler könnte sich über das Argument type beschweren, das Sum versucht, ausgeführt werden, da es nicht abgeleitet werden kann. Sie können das Argument type wie folgt angeben: wo T ist der Typ, den Sie die Sum ausführen möchten.

return list.Sum<T>(x => x.Value); 

Es sollte jedoch beachtet werden, dass weder Ihre Proben für mich kompiliert, auch wenn an die Basis BindingList<T> zurückkehrt, ohne die Art Argument zu setzen.

+0

Das muss es sein ... glaubst du, das liegt daran, dass es mehrere IEnumerable Implementierungen auf dem Typ gibt? – Dan

+0

@Dan Innerhalb Ihrer Summe (x => x.Value) entfernt x.Value die Fähigkeit, die dieser Ausdruck in etwas über alle Objekte auswerten kann; Sie geben jetzt einen Typ an, der eine Eigenschaft von Value haben muss, um richtig ausgewertet zu werden. Wenn Sie den Typ nicht innerhalb des type-Arguments der Sum-Erweiterungsmethode angeben, hat er keine Idee, wie der Ausdruck auszuwerten ist. –