2

通过检查是否存在满足接口的方法/属性,我已经准备好使用 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
}

当然,您可以扩展它来检查不仅仅是名称,如签名、返回类型等。

想法?

4

1 回答 1

1

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

  1. 反射很慢
  2. 动态调用也比强类型调用慢得多
  3. 代码更复杂

而且我看不到任何优势,除了可能非常特殊的需求......

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

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

于 2011-08-24T23:00:41.763 回答