一个用于C#的鸭子类型库,它不会破坏对象标识?

时间:2013-05-12 16:21:01

标签: c# .net oop duck-typing object-identity

我一直担心我可以为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));
    }
}

1 个答案:

答案 0 :(得分:1)

根据我的理解,给定对类型未知的对象的引用,但期望具有给定签名的Quack方法,您希望使用Quack方法生成某个内容类似签名将调用原始对象中的适当方法。您进一步希望后一个对象应该比较引用 - 等于原始对象。你寻求的东西是不可能的。

但是,您可以在Quack或泛型类型上定义Object扩展方法,该方法将检查其参数的类型,看它是否有{{1方法,并调用它,如果是这样。每个感兴趣的方法签名都需要一个单独的样板方法,但是可能会将它们分别归结为大约4-5行样板代码(调用一种常用的方法来使用Reflection来找到类型中的相应成员)并缓存结果)。