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

时间:2011-02-25 06:53:10

标签: c# .net methods reflection properties

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

5 个答案:

答案 0 :(得分:204)

你可以这样写:

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

编辑:您甚至可以执行扩展方法并像这样使用

myObject.HasMethod("SomeMethod");

答案 1 :(得分:72)

通过反思

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

类似于方法

答案 2 :(得分:40)

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

答案 3 :(得分:16)

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

public interface IMyInterface
{
   void Somemethod();
}


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

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

你所指的是duck-typing,这在你已经知道对象有方法的情况下很有用,但是编译器无法检查它。 例如,这在COM互操作场景中很有用。 (查看this文章)

如果你想将鸭子打字与反射相结合,那么我认为你错过了鸭子打字的目标。

答案 4 :(得分:0)

为了避免AmbiguousMatchException,我宁愿说

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