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

Lou*_*hys 148 .net c# reflection methods properties

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

Jul*_*ien 217

你可以这样写:

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

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

myObject.HasMethod("SomeMethod");
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢写:objectToCheck.GetType().GetMethod(methodName)!= null (8认同)
  • 是的,GetType()返回运行类型,而typeof()将返回对象. (2认同)

Ste*_*cya 81

通过反思

 var property = object.GetType().GetProperty("YourProperty")
 property.SetValue(object,some_value,null);
Run Code Online (Sandbox Code Playgroud)

类似的是方法


ess*_*kar 41

这是一个老问题,但我刚刚碰到它. 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)


Fre*_*els 17

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

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这是一种气味,但它是由微软创建的.查看WebControls,如Button,LinkBut​​ton等.它们都实现了OnClientClick属性,但是,ListControl和Panel则没有.OnClientClick未在界面中定义,因此反射是唯一的选项. (5认同)
  • 也许你应该看一下用COM编写Adobe产品的脚本.相同的函数调用可以返回完全不同的COM对象,并且通过(Adobe)的设计,它们唯一的共同祖先是对象.另外:这是几乎所有现代动态脚本语言中常见的模式(Python,Javascript,VB脚本,PHP,Lua ......我可以继续).这不是一个错误,这是一个功能. (3认同)
  • 如果对象可以是.NET框架提供的对象,我不能声明它实现什么呢? (2认同)