Подтвердить что ты не робот

Как проверить, имеет ли объект определенный метод/свойство?

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

4b9b3361

Ответ 1

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

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

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

myObject.HasMethod("SomeMethod");

Ответ 2

через Reflection

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

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

Ответ 3

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

Ответ 4

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

public interface IMyInterface
{
   void Somemethod();
}


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

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

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

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