Ich bin ein einfaches Wrapper-Schreiben auf „Ente“ ein dynamic
Objekt gegen eine bekannte Schnittstelle:Gibt es ein C# -Aquivalent zu Rubys "respond_to?"?
interface IFoo { string Bar(int fred); }
class DuckFoo : IFoo
{
private readonly dynamic duck;
public DuckFoo(dynamic duck)
{
this.duck = duck;
}
public string Bar(int fred)
{
return duck.Bar(fred);
}
}
Dies funktioniert gut, wenn die dynamic
Objekt auf die Bar
Signatur reagieren kann. Aber wenn das nicht klappt scheitert das nur wenn ich Bar
rufe. Ich würde es bevorzugen, wenn es schneller ausfallen könnte, d. H. Mit Argumentvalidierung bei der Konstruktion der DuckFoo
-Hülle. Etwas wie folgt aus:
public DuckFoo(dynamic duck)
{
if(/* duck has no matching Bar method */)
throw new ArgumentException("duck", "Bad dynamic object");
this.duck = duck;
}
In Ruby gibt es eine respond_to?
Methode, die verwendet werden können, um zu testen, ob ein Objekt „hat“ eine bestimmte Methode. Gibt es eine Möglichkeit, das mit dynamischen Objekten in C# 4 zu testen?
(Ich bin mir bewusst, dass auch bei diesem die Bar Anruf überprüfen konnte später scheitern, weil die Dynamik der duck
sie Verfahren stoppen lassen auf später zu reagieren.)
Was passiert, wenn Sie "duck.GetType()" eingeben, wenn "duck" als "dynamische Ente" deklariert ist? Welchen Typ gibt es zurück? – dtb
Wenn das dynamische Objekt ein .NET-Objekt ist, erhalten Sie den Typ des Objekts. –
Ich glaube nicht, dass Sie eine solche Reflektion auf dynamischen Objekten vornehmen können ... Vielleicht, wenn es sich um normale CLR-Objekte handelt, können Sie aber nicht mit Objekten aus IronRuby ... –