1

令我担心的是,我可以为 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));
    }
}
4

2 回答 2

1

据我了解,给定一个类型未知的对象的引用,但期望有一个Quack具有给定签名的方法,您希望生成一个具有Quack类似签名的方法的东西,该方法将调用原始对象中的适当方法. 您还希望后一个对象应该将引用相等与原始对象进行比较。你寻求的东西是不可能的。

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

于 2013-06-16T21:53:46.560 回答
1

根据您的问题的准确性,答案是否定的。你不能。

Object.ReferenceEquals是两个对象的内存地址之间的直接比较。

正是出于这个原因,以下代码写入False控制台窗口,即使从逻辑上讲,您可能认为它应该这样写True

int myVar = 0;
Console.WriteLine(Object.ReferenceEquals(myVar, myVar))

在 的情况下myVar,结果是False因为值类型被装箱到object指向 的实例中myVar

Duck Typing 本身会在您的对象周围创建一种框形式。

如果您自己实现了 Duck Typing,您可以拥有自己的ReferenceEquals方法来利用这种装箱object心态,并在进行比较之前正确地拆箱原始文件ReferenceEquals

于 2022-02-20T06:38:30.883 回答