Ответы:
Вы могли бы написать что-то вроде этого:
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
?