Może używasz wzorca dynamicznego? Możesz wywołać dowolną metodę / właściwość za pomocą dynamicznego słowa kluczowego, prawda? Jak na przykład sprawdzić, czy metoda istnieje przed wywołaniem myDynamicObject.DoStuff ()?
Może używasz wzorca dynamicznego? Możesz wywołać dowolną metodę / właściwość za pomocą dynamicznego słowa kluczowego, prawda? Jak na przykład sprawdzić, czy metoda istnieje przed wywołaniem myDynamicObject.DoStuff ()?
Odpowiedzi:
Możesz napisać coś takiego:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Edycja: możesz nawet wykonać metodę rozszerzenia i używać jej w ten sposób
myObject.HasMethod("SomeMethod");
poprzez refleksję
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Podobnie jest z metodami
GetType()
tym jest metoda GetProperties()
. Zwraca tablicę PropertyInfo
. Ale jak mogę użyć GetProperties()
metody?
To stare pytanie, ale właśnie na nie wpadłem.
Type.GetMethod(string name)
zgłosi AmbiguousMatchException, jeśli istnieje więcej niż jedna metoda o tej nazwie, więc lepiej obsłużmy ten przypadek
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;
}
}
Czy nie byłoby lepiej nie używać do tego żadnych typów dynamicznych i pozwolić swojej klasie zaimplementować interfejs. Następnie możesz sprawdzić w czasie wykonywania, czy obiekt implementuje ten interfejs, a zatem ma oczekiwaną metodę (lub właściwość).
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Myślę, że to jedyny właściwy sposób.
Rzecz, do której się odnosisz, to pisanie kaczkowe, co jest przydatne w scenariuszach, w których wiesz już, że obiekt ma metodę, ale kompilator nie może tego sprawdzić. Jest to przydatne na przykład w scenariuszach międzyoperacyjnych modelu COM. (sprawdź ten artykuł)
Jeśli chcesz na przykład połączyć pisanie kaczką z refleksją, myślę, że nie osiągasz celu, jakim jest pisanie kaczką.
DynamicObject
?