我一直担心我可以为C#找到的鸭子类型库会破坏对象的身份,即Object.ReferenceEquals
对于鸭子类型的对象及其原始对象返回false。
我感觉不可能在C#中实现无包装/无代理解决方案,但希望我错了,有人知道一个不违反这个基本OO概念的库吗?
编辑,请求了一个代码示例:
public class MyClass
{
private SomeInterface _someInterface;
// Dynamic is possible here but the type safety is helpful
// when having multiple constructors, for example.
public MyClass(AnotherClass c)
{
_someInterface = c.ActLike<SomeInterface>();
Trace.Assert(object.ReferenceEquals(c, _someInterface));
}
}
答案 0 :(得分:1)
根据我的理解,给定对类型未知的对象的引用,但期望具有给定签名的Quack
方法,您希望使用Quack
方法生成某个内容类似签名将调用原始对象中的适当方法。您进一步希望后一个对象应该比较引用 - 等于原始对象。你寻求的东西是不可能的。
但是,您可以在Quack
或泛型类型上定义Object
扩展方法,该方法将检查其参数的类型,看它是否有{{1方法,并调用它,如果是这样。每个感兴趣的方法签名都需要一个单独的样板方法,但是可能会将它们分别归结为大约4-5行样板代码(调用一种常用的方法来使用Reflection来找到类型中的相应成员)并缓存结果)。