2011-02-25 17 views
120

Uso de un patrón dinámico tal vez? Puede llamar a cualquier método/propiedad usando la palabra clave dinámica, ¿verdad? ¿Cómo verificar si el método existe antes de llamar a myDynamicObject.DoStuff(), por ejemplo?¿Cómo verificar si un objeto tiene cierto método/propiedad?

+0

¿Cuál es el tipo de myDynamicObject * *? ¿Es una clase derivada de 'DynamicObject'? –

+0

algo declarado con la palabra clave dinámica –

Respuesta

180

Se podría escribir algo así:

public static bool HasMethod(this object objectToCheck, string methodName) 
{ 
    var type = objectToCheck.GetType(); 
    return type.GetMethod(methodName) != null; 
} 

Editar: incluso se puede hacer un método de extensión y utilizar de esta manera

myObject.HasMethod("SomeMethod"); 
+0

GetType() devolverá el tipo de tiempo de ejecución? (es decir, ¿no objeto?) –

+2

sí, GetType() devuelve el tipo de ejecución mientras typeof() devolverá el objeto. – Julien

+1

De acuerdo con los documentos GetType() devolverá "El tipo de tiempo de ejecución exacto de la instancia actual". – tzup

14

¿No sería mejor no usar ningún tipo dinámicos 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.

Lo que usted se refiere es de pato a escribir, que es útil en situaciones en las que ya se sabe que el objeto tiene el método, pero el compilador no puede comprobar para eso. Esto es útil en escenarios de interoperabilidad COM por ejemplo. (Consulte el artículo this)

Si desea combinar el pato-tipado con la reflexión, por ejemplo, creo que se está perdiendo el objetivo del pato-tipado.

+2

¿y si el objeto puede ser un objeto proporcionado por .NET framework, y no puedo declarar que implemente algo? –

+0

¿Cuál es el problema? Puede verificar si el 'objeto' es un objeto así, provisto por el framework .NET de la misma manera, por ejemplo, –

+0

, desea verificar si hay un método "Agregar" en un objeto. Y el objeto puede ser una Lista , o alguna otra clase que no sea IEnumerable –

64

través de la reflexión

var property = object.GetType().GetProperty("YourProperty") 
property.SetValue(object,some_value,null); 

Similar es para los métodos

+0

Agradable. También puede hacer GetMethod en un bucle para obtener la propiedad definida apropiada. – Jnr

32

Es una vieja pregunta, pero me encontré con ella. Type.GetMethod(string name) arrojará una AmbiguousMatchException si hay más de un método con ese nombre, por lo que es mejor gestionar el 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; 
    } 
} 
Cuestiones relacionadas