对象作为没有实现的接口

本文关键字:实现 接口 对象 | 更新日期: 2023-09-27 18:09:46

我遇到了一个奇怪的情况,我的一个方法必须接收一个对象或一个动态参数(因为它将接收任何东西),但我确实关心那个类实现至少两个方法。

显然,只使用和接口,所有想要在我的方法上接收的对象都必须实现,这将是伟大的;很遗憾,我不能保证……

我在我的类中使用了很多对象(和这两个函数),并且想要引用具有"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

谢谢

对象作为没有实现的接口

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

您可以创建强类型包装器,以保护其余代码不受强制类型转换的影响。包装器既可以只依赖于dynamic/反射,也可以使用一些更复杂的代码,比如用表达式树构造每个传入类型的唯一实例。

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()};
}