我处理一种奇怪的情况,我的某个方法必须接收对象或动态参数(因为它会收到任何内容) ,但我确实关心该类至少实现了两种方法。
显然,仅仅使用和接口,希望在我的方法上接收的所有对象都必须实现;遗憾的是我无法保证......
我在我的类中使用了很多对象(以及这两个函数),并希望引用具有"类型"的对象。 " 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 :(得分: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()};
}