成员验证与接口

时间:2011-08-24 22:51:56

标签: c# ruby dynamic interface duck-typing

我已经准备好了Ruby通过检查是否存在满足接口的方法/属性来强制执行动态类型的接口的方法。

这总体上比使用接口更好的设计原则是什么?有什么利弊。例如,您可以在C#中实现相同的概念,但我不确定它是否具有相同的值,

public class Foo
{
   public Foo(dynamic _obj)
   {
        MethodInfo[] methods= _obj.GetType().GetMethods();

        if (!methods.Any(x => x.Name == "SomeRequiredMethod")
        {
            throw new ArgumentException("Object does not meet interface requirements.");
        }
   }

   // proceed with functionality that requires the method
}

当然,你可以扩展它来检查更多的名称,如签名,返回类型等。

思想?

1 个答案:

答案 0 :(得分:1)

我可以看到这种方法存在的几个主要问题:

  1. 反射很慢
  2. 动态调用也比强类型调用慢得多
  3. 代码更复杂
  4. 除了非常具体的需求外,我看不出任何优势......

    C#被设计为一种静态的强类型语言,即使它现在具有一些动态功能,但只有在没有强类型替换时才能使用它们。

    如果您确实需要动态使用该对象,请不要手动检查成员:相反,将代码放在try块中,并捕获在您调用的成员丢失时将发生的RuntimeBinderException