Возможно использование динамического шаблона? Вы можете вызвать любой метод/свойство, используя динамическое ключевое слово, правильно? Как проверить, существует ли метод до вызова myDynamicObject.DoStuff(), например?
Как проверить, имеет ли объект определенный метод/свойство?
Ответ 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-взаимодействия. (отметьте эту статью)
Если вы хотите совместить утиную печать с отражением, например, я думаю, что вам не хватает цели утиного ввода.