Why is a member of base class different from the same member in derived class?
这是此问题的后续问题:lambda表达式未返回预期的memberinfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Human
{
public string name { get; set; }
}
class Man : Human
{
}
var m1 = typeof(Human).GetProperty("name");
var m2 = typeof(Man).GetProperty("name");
//m1 != m2 why? |
同样适用于MethodInfos。
我可以理解,当Human是一个接口时,或者当Human的name是抽象的/虚拟的时,必须存在差异。但是为什么对于密封型呢?难道Man的name不是Human的name吗?
澄清:正如乔恩所说,他们的ReflectedType是不同的。当决定接口成员或被重写成员的相等性时,相等的ReflectedType应该很方便,因为它们是不同的。但我不认为这是决定平等的简单案件,如上述。可能是设计团队想要保持一致。只是想知道是什么原因促使框架设计者在决定跨多个类的同一成员的相等性时考虑ReflectedType属性。
它们的ReflectedType属性不同:
The ReflectedType property retrieves the Type object that was used to obtain this instance of MemberInfo. This may differ from the value of the DeclaringType property if this MemberInfo object represents a member that is inherited from a base class.
因此,如果打印出m1.ReflectedType,它应该打印Human。如果打印出m2.ReflectedType,则应打印Man。
编辑:在实现相等运算符的原因方面:在对象之间可能存在可区分但不是"主要"差异的情况下,计算==的含义始终是一个微妙的设计决策。在这里,提供不同的IEqualityComparer实现是有用的,但这当然不适用于操作员本身。
一般来说,如果x == y是真的,那么x.Foo与y.Foo在任何财产上都不一样是很不寻常的。我不能立即想到框架中发生的任何情况。
- 乔恩,我理解这一点,而且它们可能在许多其他方面有所不同,但我的问题更像是C/.NET团队为什么决定这么做。我会澄清我的问题
- @纳法尔:我想在某些情况下,了解哪种类型的信息是有用的。老实说,我不确定他们在许多其他方面会有所不同。如果你的问题真的是"为什么ReflectedType存在?"那就大相径庭了。
- 还有一点:startbigthinksmall.wordpress.com/2008/12/10/…
- @琼斯基特,知道他们的反射类型确实有用,但我不知道为什么它被认为是平等的。我认为m1 = new MemberInfo { Name ="name", ReflectedType = Human }应该等于m2 = new MemberInfo { Name ="name", ReflectedType = Man }。
- @纳瓦尔:那么现在你的问题真的是关于如何实现重载的==操作符?(同样,这还不清楚-我认为这不仅仅是返回对相同对象的引用…)
- 你为什么期望这些平等?这就像是说new AppleInBasket{Apple = redApple, Basket = basket1}和new AppleInBasket{Apple = redApple, Basket = basket2)应该相等,因为它们都含有一个红苹果。
- @乔恩斯基特,那是我的本意,当然我没有把它恰当地表达出来。
- @取决于域的编解码器不是吗?如果我们纯粹是在谈论苹果,那么它是在篮子1还是篮子2里呢?我想是这样的,所以我的问题。如果你认为不是,你可以回答(这正是我要问的)。
- @纳瓦尔:看我的编辑。出于兴趣,您能想到这样的例子吗:对于可区分的值,==返回true?我现在唯一能想到的就是浮点结构的+0和-0…我想不出类似的例子来上课。
- @不,因为你问一个AppleInBasket对象它是否与另一个实例相同,而这个对象的相等比较器确实考虑了篮子。它的工作原理和MemberInfo一样。如果你的问题是"为什么是这样的",那么请问。-)
- @Jonskeet我不能在框架中,但我相信PPL经常写这样的域模型,其中两个模型在许多方面可能不同,但将是平等的(基于ID、名称等)。
- @Nawfal:但是MemberInfo是在框架中的:)我要说的是,如果它按照您期望的方式运行,它将是框架中唯一这样做的类,据我所知。我认为,比起目前的行为,更多的人会对此感到惊讶。
- @codecaster//这个对象的相等比较器确实考虑了这个篮子。//如果这是您的域逻辑所要求的,它会考虑的。我已经说过了,这取决于逻辑是什么。问题是你在下一句话中到底写了什么,"为什么会这样?这个域(memberinfo的东西)是否等同于你的想法(苹果在篮子里),这正是乔恩努力解释的。
- @Jonskeet指出,==对于可分辨值返回true的例子是一个开眼器。将为此接受此项:)