对象作为没有工具的接口

时间:2015-08-26 02:40:13

标签: c# .net

我处理一种奇怪的情况,我的某个方法必须接收对象动态参数(因为它会收到任何内容) ,但我确实关心该类至少实现了两种方法。

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

我在我的类中使用了很多对象(以及这两个函数),并希望引用具有"类型"的对象。 " 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

由于

1 个答案:

答案 0 :(得分:3)

如果您不能要求传入的对象实现界面,则您不能使用直接引用强类型代码(这在您似乎尝试实现duck typing时有意义。)< / p>

您可以创建强类型包装器,以保护代码的其余部分不受强制转换。包装器可以只依赖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()};
}