Можливо, використовуєте динамічну схему? Ви можете викликати будь-який метод / властивість, використовуючи динамічне ключове слово, правда? Як перевірити, чи існує метод, перш ніж викликати, наприклад, myDynamicObject.DoStuff ()?
Можливо, використовуєте динамічну схему? Ви можете викликати будь-який метод / властивість, використовуючи динамічне ключове слово, правда? Як перевірити, чи існує метод, перш ніж викликати, наприклад, myDynamicObject.DoStuff ()?
Відповіді:
Ви можете написати щось подібне:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Редагувати: ви навіть можете зробити метод розширення та використовувати його так
myObject.HasMethod("SomeMethod");
через рефлексію
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Аналогічно і для методів
GetType()
є такий метод, як GetProperties()
. Це повертається масив PropertyInfo
. Але як я можу використовувати GetProperties()
метод?
Це старе питання, але я просто наткнувся на нього.
Type.GetMethod(string name)
викине AmbiguousMatchException, якщо існує більше одного методу з таким ім'ям, тому ми краще обробляємо цей випадок
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;
}
}
Чи не було б краще не використовувати для цього ніяких динамічних типів, а дозволити вашому класу реалізувати інтерфейс. Потім ви можете перевірити під час виконання об'єкта, що реалізує цей інтерфейс, і, таким чином, має очікуваний метод (або властивість).
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Я думаю, що це єдино правильний спосіб.
Те, про що ви посилаєтесь, - це набирання качок, що корисно в сценаріях, де ви вже знаєте, що в об'єкті є метод, але компілятор не може цього перевірити. Це корисно, наприклад, у сценаріях взаємодії COM. (перевірте цю статтю)
Якщо ви хочете, наприклад, поєднати введення качки з відображенням, то я думаю, що ви пропускаєте мету набору качок.
DynamicObject
?