¿Usando un patrón dinámico quizás? Puede llamar a cualquier método / propiedad utilizando la palabra clave dinámica, ¿verdad? ¿Cómo verificar si el método existe antes de llamar a myDynamicObject.DoStuff (), por ejemplo?
¿Usando un patrón dinámico quizás? Puede llamar a cualquier método / propiedad utilizando la palabra clave dinámica, ¿verdad? ¿Cómo verificar si el método existe antes de llamar a myDynamicObject.DoStuff (), por ejemplo?
Respuestas:
Podrías escribir algo así:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Editar: incluso puedes hacer un método de extensión y usarlo así
myObject.HasMethod("SomeMethod");
a través de la reflexión
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Similar es para métodos
GetType()
hay un método como GetProperties()
. Está devolviendo la matriz de PropertyInfo
. Pero, ¿cómo puedo usar el GetProperties()
método?
Es una vieja pregunta, pero me la encontré.
Type.GetMethod(string name)
lanzará una AmbiguousMatchException si hay más de un método con ese nombre, por lo que es mejor que manejemos ese caso
public static bool HasMethod(this object objectToCheck, string methodName)
{
try
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
catch(AmbiguousMatchException)
{
// ambiguous means there is more than one result,
// which means: a method with that name does exist
return true;
}
}
¿No sería mejor no usar ningún tipo dinámico para esto y dejar que su clase implemente una interfaz? Luego, puede verificar en tiempo de ejecución si un objeto implementa esa interfaz y, por lo tanto, tiene el método (o propiedad) esperado.
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Creo que esta es la única forma correcta.
A lo que te refieres es a escribir pato, lo cual es útil en escenarios en los que ya sabes que el objeto tiene el método, pero el compilador no puede verificarlo. Esto es útil en escenarios de interoperabilidad COM, por ejemplo. (mira este artículo)
Si desea combinar la escritura de pato con la reflexión, por ejemplo, creo que se está perdiendo el objetivo de la escritura de pato.
DynamicObject
?