Ich möchte eine einfache Ente eingeben Beispiel in C# mit dynamischen Objekten. Es scheint mir, dass ein dynamisches Objekt HasValue/HasProperty/HasMethod-Methoden mit einem einzelnen String-Parameter für den Namen des Wertes, der Eigenschaft oder der Methode haben sollte, nach dem Sie suchen, bevor Sie versuchen, dagegen zu laufen. Ich versuche zu vermeiden, versuchen/fangen Blöcke und tiefer Reflexion, wenn möglich. Es scheint nur eine gängige Praxis zu sein, in dynamischen Sprachen (JS, Ruby, Python usw.) zu tippen, um nach einer Eigenschaft/Methode zu suchen, bevor man versucht, sie zu benutzen, dann auf einen Standard zurückzufallen oder eine kontrollierte Ausnahme auszulösen . Das folgende Beispiel ist im Grunde das, was ich erreichen möchte.Ducktyp testen mit C# 4 für dynamische Objekte
Wenn die oben beschriebenen Methoden nicht existieren, hat jemand vorgefertigte Erweiterungsmethoden für dynamische, die dies tun?
Beispiel: In JavaScript kann ich relativ einfach eine Methode auf einem Objekt testen.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}
Wie würde ich das Gleiche tun in C#?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?
//if it doesn't quack, return null
}
Nur als eine Anmerkung für jeden auf der Suche ... ExpandoObject (unsicher von anderen) implementiert IDictionary, so dass Sie mit var myDynamicAsDictionary = myDyn als IDictionary ; Testen Sie dann auf null und .HasKey() –
Tracker1
möglich Duplikat von [dynamisch, So testen Sie, ob eine Eigenschaft verfügbar ist] (http://stackoverflow.com/questions/2998954/dynamic-how-to-test-if-a -property-is-available) – nawfal
@nawfal meine war 2 Tage früher als die, mit der du verlinkt hast ... Ich dachte nur, dass es möglich sein könnte, solche Prüfmethoden mit generischen Typ-Signaturen zu erzeugen ... 'Duck.HasFunc (String-Name) 'als Beispiel-Signatur ... Ich verwende C# nicht mehr auf dieser Ebene, aber es wäre interessant. –
Tracker1