如何检查对象是否具有某种方法/属性?

也许使用动态模式?您可以使用 Dynamic 关键字调用任何方法/属性,对吗?例如,如何在调用 myDynamicObject.DoStuff ()之前检查该方法是否存在?

185280 次浏览

为此不使用任何动态类型,并让您的类实现一个接口不是更好吗。 然后,可以在运行时检查对象是否实现了该接口,从而具有预期的方法(或属性)。

public interface IMyInterface
{
void Somemethod();
}




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

我认为这是唯一正确的方法。

您引用的是 Duck-type,这在您已经知道对象具有该方法但编译器无法检查该方法的情况下非常有用。 例如,这在 COM 互操作场景中很有用(请参阅 这个文章)

例如,如果您想将 Duck 类型与反射相结合,那么我认为您就错过了 Duck 类型的目标。

通过反射

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

方法也是类似的

你可以这样写:

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

编辑: 你甚至可以做一个扩展方法并像这样使用它

myObject.HasMethod("SomeMethod");

这是个老问题了,但我刚好碰到了。 如果有多个方法具有该名称,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;
}
}

为了避免 AmbiguousMatchException,我宁愿说

objectToCheck.GetType().GetMethods().Count(m => m.Name == method) > 0