2015-08-26 32 views
0

我在一个奇怪的情况是,我的方法之一,有接受或一个对象动态参数(因为它会收到关于任何东西),但我关心的是类实现至少两种方法。对象为界面,而无需工具

很明显,只使用和接口,希望在我的方法上接收的所有对象都必须实现,可悲的是我不能保证...

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

感谢

+0

我是否误解了你的问题?公共ClassThatReceivesAnything(IImplementsBothMethods obj){}不是一个选项吗? –

回答

3

如果你不能要求进入的对象来实现,你不能有直接引用强类型代码(这是有道理的接口,你似乎想实现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()}; 
} 
+0

今天学到了新东西......鸭子打字。 – displayName

+0

谢谢,今天试了一下,它工作! –