14 Stimmen

Anonyme Klasse, die ein Interface implementiert

Ich habe den folgenden Code in einer Methode:

 var list = new[]
  {
   new { Name = "Rot", IsSelected = true },
   new { Name = "Grün", IsSelected = false },
   new { Name = "Blau", IsSelected = false },
  };

Ich würde gerne eine Funktion aufrufen, die eine Liste von Elementen erfordert, wobei jedes Element ein Interface implementiert (ISelectable). Ich weiß, wie dies mit normalen Klassen gemacht wird, aber in diesem Fall versuche ich nur, einige Demo-Daten einzufügen.

Ist es möglich, eine anonyme Klasse zu erstellen, die ein Interface implementiert?

so:

new { Name = "Rot", IsSelected = true } : ISelectable

12voto

Lasse V. Karlsen Punkte 364542

Nein, das ist nicht möglich.

Ein anonymer Typ soll intern ein leichtgewichtiges Transportobjekt sein. Sobald Sie jedoch mehr Funktionalität benötigen als die bereitgestellte Syntax, müssen Sie ihn als normalen benannten Typ implementieren.

Dinge wie Vererbung und Schnittstellenimplementierungen, Attribute, Methoden, Eigenschaften mit Code usw. Nicht möglich.

12voto

jbtule Punkte 30716

Das Open-Source-Framework impromptu-interface ermöglicht es Ihnen, dies effektiv mit einem leichten Proxy und dem DLR zu tun.

new { Name = "Rot", IsSelected = true}.ActLike();

1 Stimmen

Dies ist unglaublich! Ich spiele damit herum in LINQPad und es funktioniert bisher brilliant.

1voto

Rodrick Chapman Punkte 5327

Auch wenn du dies tun könntest, würdest du es höchstwahrscheinlich nicht wollen, da eine Methode alles über die anonyme Klasse wissen würde (d.h. es gibt keine Kapselung und auch keinen Nutzen beim indirekten Zugriff auf Dinge).

Andererseits habe ich darüber nachgedacht, wie eine solche Funktion aussehen könnte (potenziell nützlich, wenn ich ein Objekt mit anonymer Typisierung an eine Methode übergeben möchte, die eine bestimmte Schnittstelle erwartet… oder so dachte ich).

Der minimalistischste Syntax für einen anonymen Typ, der eine Schnittstelle IFoo erbt, wäre etwas wie

new {IFoo.Bar = 2} // wenn IFoo.Bar eine Eigenschaft ist

oder

new {IFoo.Bar() = () => do stuff} wenn IFoo.Bar eine Methode ist

Dies ist jedoch der einfache Fall, in dem IFoo nur eine Eigenschaft oder Methode hat. Im Allgemeinen müsstest du alle Elemente von IFoo implementieren; einschließlich Lese-/Schreibeigenschaften und Ereignisse, was derzeit nicht einmal auf anonym getypten Objekten möglich ist.

0 Stimmen

Stimmt, das wäre ordentlich. Vielleicht das Interface der anonymen Klasse so spezifizieren: new {IFoo.Bar = 2}:IFoo;

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