加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否有一个C#等同于Ruby的`respond_to?`?

发布时间:2020-12-15 07:45:33 所属栏目:百科 来源:网络整理
导读:我正在编写一个简单的包装器来“躲避”一个已知接口的动态对象: interface IFoo { string Bar(int fred); }class DuckFoo : IFoo{ private readonly dynamic duck; public DuckFoo(dynamic duck) { this.duck = duck; } public string Bar(int fred) { retu
我正在编写一个简单的包装器来“躲避”一个已知接口的动态对象:
interface IFoo { string Bar(int fred); }

class DuckFoo : IFoo
{
    private readonly dynamic duck;

    public DuckFoo(dynamic duck)
    {
        this.duck = duck;
    }

    public string Bar(int fred)
    {
        return duck.Bar(fred);
    }
}

如果动态对象可以响应Bar签名,则此方法可以正常工作.但如果它不能,只有当我打电话给Bar时才会失败.我希望它能否更快失败,即在构建DuckFoo包装器时进行参数验证.像这样的东西:

public DuckFoo(dynamic duck)
{
    if(/* duck has no matching Bar method */)
        throw new ArgumentException("duck","Bad dynamic object");
    this.duck = duck;
}

在Ruby中有一个respond_to?可用于测试对象是否“具有”某种方法的方法.有没有办法在C#4中使用动态对象进行测试?

(我知道即使使用此检查,Bar调用也可能在以后失败,因为duck的动态特性让它在以后停止响应方法.)

解决方法

您可以在构造时检查使用Reflection包装的对象上可用的方法.

只需在界面上调用Type.GetMethods()并传入类型,并确保存在适当的方法.

编辑:

正如itowlson所建议的那样,还有一个处理动态类型的选项.如果检查传递的对象上是否存在IDynamicMetaObjectProvider接口,则可以调用IDynamicMetaObjectProvider.GetMetaObject().GetDynamicMemberNames()并使用此信息.

如果接口不存在,则可以恢复为Type.GetMethods().

这应该处理“动态”类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读