5 Stimmen

Übergabe einer Interface-Sammlung

Angenommen, Sie haben die folgende Klasse:

class Car : IPainting
{
 ...
}

Dann eine Funktion wie diese:

void AddCars(IEnumerable<Car> collection)

Dann ein Codeschnipsel wie dieser:

Car bmw = new Car();
Car mercedes = new Car();

IPainting a = (IPainting) bmw;
IPainting b = (IPainting) mercedes;

IPainting[] paintings = new IPainting[] {a, b};

AddCars(paintings); // fails to compile

Dies lässt sich natürlich nicht kompilieren, da die AddCars()-Methode nur eine Sammlung von Autos akzeptiert, aber das ist es, woraus das Array "paintings" besteht.

Ich weiß, dass C# 4.0 wahrscheinlich eine Lösung für dieses Problem bieten wird. Gibt es heute irgendeine Abhilfe für dieses Problem?

Danke,

Alberto

9voto

Nick Craver Punkte 609016

Versuchen Sie es mit einer generischen Methode:

void AddCars<T>(IEnumerable<T> collection) where T : IPainting

4voto

Klaus Byskov Pedersen Punkte 111081

Wie wäre es mit der Verwendung von Linq: AddCars(paintings.Cast<Car>());

4voto

Chris Stavropoulos Punkte 1746

Ihr Code ist grundlegend fehlerhaft. Ihre Klasse garantiert, dass alle Autos IPainting implementieren, aber es gibt keine Garantie, dass alle IPainting Autos sind.

Mit etwas Guss könnte man das wahrscheinlich hinbekommen, aber ich denke, Sie sollten Ihren Entwurf überdenken.

AddCars(new Car[] { bmw, mercedes });

3voto

Fredrik Mörk Punkte 151006

C# 4 wird den von Ihnen geschriebenen Code nicht zulassen, da die Methode AddCars erwartet eine IEnumerable<Car> die Folgendes implementiert IPainting . Dies bedeutet nicht, dass Sie die cualquier implementierende Klasse IPainting (Sie könnten zum Beispiel eine class Bike : IPainting die nichts mit dem Car Klasse überhaupt. Der umgekehrte Fall ist jedoch möglich; wenn Sie void AddCars(IEnumerable<IPainting> collection) können Sie eine List<Car> zur Methode.

Bis dahin müssen Sie sich damit begnügen, die Car Sequenzen zur Methode, indem sie einen Casting-Mechanismus verwenden (z. B. painting.Cast<Car>() in anderen Antworten vorgeschlagen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X