Estoy queriendo tener un ejemplo de tipado de pato simple en C# usando objetos dinámicos. Me parece que un objeto dinámico debe tener métodos HasValue/HasProperty/HasMethod con un solo parámetro de cadena para el nombre del valor, propiedad o método que está buscando antes de intentar ejecutarlo. Estoy tratando de evitar probar/atrapar bloques, y una reflexión más profunda si es posible. Simplemente parece ser una práctica común para el tipado de patos en lenguajes dinámicos (JS, Ruby, Python, etc.) que es probar una propiedad/método antes de intentar usarlo, luego volver a caer en un valor predeterminado, o arrojar una excepción controlada . El siguiente ejemplo es básicamente lo que quiero lograr.Prueba de tipo de pato con C# 4 para objetos dinámicos
Si los métodos descritos anteriormente no existen, ¿alguien tiene métodos de extensión prefabricados para dynamic que harán esto?
Ejemplo: En JavaScript puedo probar un método sobre un objeto con bastante facilidad.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}
¿Cómo voy a hacer lo mismo en 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
}
Al igual que una nota para todos los que buscan ... ExpandoObject (inseguro de otros) implementa IDictionary para que pueda probar con var myDynamicAsDictionary = myDyn como IDictionary ; luego prueba null, y .HasKey() –
Tracker1
posible duplicado de [dinámico, Cómo probar si una propiedad está disponible] (http://stackoverflow.com/questions/2998954/dynamic-how-to-test-if-a -property-is-available) – nawfal
@nawfal mina fue 2 días antes que la que se enlazó a ... Estaba pensando que sería posible crear tales métodos de comprobación con las firmas de tipo genérico ... 'Duck.HasFunc (string name) 'como una firma de ejemplo ... Ya no uso C# en este nivel, pero sería interesante. –
Tracker1