【问题标题】:Object as Interface without implements对象作为没有实现的接口
【发布时间】:2015-08-26 02:40:12
【问题描述】:

我处于一种奇怪的情况,我的一个方法必须接收 objectdynamic 参数(因为它会接收任何东西),但是我确实关心该类至少实现了两种方法。

显然,最好只使用和接口,所有希望在我的方法上接收的对象都必须实现;遗憾的是,我不能保证...

我在我的类中使用了很多该对象(以及这两个函数),并且希望引用该对象的“类型”为“IImplementsBothMethods”,因此我可以在知道它不会被强制转换后使用它休息。

我想要的是这样的:

public interface IImplementsBothMethods
{
  Method1();
  Method2();
}

public class ClassThatReceivesAnything
{
  IImplementsBothMethods obj;

  public ClassThatReceivesAnything([dynamic|object] unknownObject)
  {
     // unknownObject does not implement the interface
     obj = unknownObject as IImplementsBothMethods;
  }

  public void MethodThatDoesNotCare()
  {
    obj.Method1();
    obj.Method2();
  }
}

我怎样才能做到这一点?转换只返回 null

谢谢

【问题讨论】:

  • 我误解了你的问题吗? public ClassThatReceivesAnything(IImplementsBothMethods obj) {} 不是一个选项吗?

标签: c# .net


【解决方案1】:

如果你不能要求传入的对象实现一个接口,你就不能有直接引用的强类型代码(这很有意义,因为你似乎正在尝试实现duck typing)。

您可以创建强类型包装器,以保护其余代码免受强制转换。包装器可以仅依赖 dynamic/reflection 或使用一些更复杂的代码,例如为每个使用表达式树构造的传入类型设置唯一实例。

class WrapperToImplementBoth : IImplementsBothMethods
{
   private dynamic inner;
   public WrapperToImplementBoth(dynamic v)
   {
        inner = v;
   }

   // let dynamic handle calls, consider catching/logging exceptions  
   public void Method1() {inner.Method1()}; 
   public void Method2() {inner.Method2()};
}

【讨论】:

  • 今天学到了一些新东西...鸭子打字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2020-07-29
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多