如何检查一个对象是否有某些方法/属性?
也许使用dynamic模式? 你可以使用dynamic关键字调用任何方法/属性,对吧? 如何在调用myDynamicObject.DoStuff()之前检查方法是否存在,例如?
你可以写这样的东西:
public static bool HasMethod(this object objectToCheck, string methodName) { var type = objectToCheck.GetType(); return type.GetMethod(methodName) != null; }
编辑:你甚至可以做一个扩展方法,并像这样使用它
myObject.HasMethod("SomeMethod");
通过reflection
var property = object.GetType().GetProperty("YourProperty") property.SetValue(object,some_value,null);
类似的方法
这是一个古老的问题,但我碰到了。 如果有多个具有该名称的方法,则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; } }
如果不为这个使用任何dynamictypes不是更好,并让你的类实现一个接口。 然后,您可以在运行时检查一个对象是否实现了该接口,并因此具有预期的方法(或属性)。
public interface IMyInterface { void Somemethod(); } IMyInterface x = anyObject as IMyInterface; if( x != null ) { x.Somemethod(); }
我认为这是唯一正确的方法。
你所指的是duck-typing,在你已经知道该对象有方法的情况下是有用的,但是编译器不能检查这个方法。 例如,这在COM互操作场景中很有用。 (检查这篇文章)
如果您想将鸭子打字与reflection相结合,那么我认为您错过了鸭子打字的目标。