如何检查一个对象是否有某些方法/属性?

也许使用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相结合,那么我认为您错过了鸭子打字的目标。