Как проверить, есть ли у объекта определенный метод / свойство? - PullRequest
141 голосов
/ 25 февраля 2011

Использование динамического шаблона возможно?Вы можете вызвать любой метод / свойство, используя ключевое слово dynamic, верно?Как проверить, существует ли метод перед вызовом myDynamicObject.DoStuff (), например?

Ответы [ 4 ]

206 голосов
/ 25 февраля 2011

Вы можете написать что-то вроде этого:

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

Редактировать: вы даже можете использовать метод расширения и использовать его вот так

myObject.HasMethod("SomeMethod");
73 голосов
/ 25 февраля 2011

через отражение

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

Аналогично для методов

41 голосов
/ 04 июля 2014

Это старый вопрос, но я просто столкнулся с ним.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;
    }
} 
16 голосов
/ 25 февраля 2011

Не лучше ли для этого не использовать динамические типы, и пусть ваш класс реализует интерфейс.Затем вы можете проверить во время выполнения, реализует ли объект этот интерфейс и, следовательно, имеет ожидаемый метод (или свойство).

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

Я думаю, что это единственный правильный путь.

То, на что вы ссылаетесь - это утка, которая полезна в сценариях, когда вы уже знаете, что у объекта есть метод, но компилятор не может проверить это.Это полезно, например, в сценариях взаимодействия COM.(отметьте эту статью)

Если вы хотите, например, совместить типизацию утки с отражением, то я думаю, что вам не хватает цели типизации утки.

...