我有两个类,它们的属性相同但值不同。当我将它们转储到LINQPad中时,我可以看到它们是不同的,但是当我这样做时x.Equals(y)
,true
即使Equals
实际比较属性值的实现也可以产生收益。
此代码重现此问题:
void Main()
{
var a1 = typeof(T1).GetCustomAttribute<A2>().Dump();
var a2 = typeof(T3).GetCustomAttribute<A2>().Dump();
a1.Equals(a2).Dump();
}
[A1(V = "I1")]
interface I1
{
[A1(V = "I1.P1")]
string P1 { get; set; }
}
[A2(V = "T1")] // <-- typeof(T1).GetCustomAttribute<A2>()
class T1 : I1
{
[A1(V = "T1.P1")]
public virtual string P1 { get; set; }
}
class T2 : T1 { }
[A1(V = "T3"), A2(V = "T3")] // <-- typeof(T3).GetCustomAttribute<A2>()
class T3 : T2
{
[A1(V = "T3.P1")]
public override string P1 { get; set; }
}
class A1 : Attribute { public string V { get; set; } }
class A2 : A1 { }
这些是结果:
UserQuery+A2 TypeId = typeof(A2) V = T1 UserQuery+A2 TypeId = typeof(A2) V = T3 True // <-- a1.Equals(a2).Dump();
我在这里缺少什么,如何正确比较它们?
该A1
属性类声明了具有私有编译器生成的后备字段的自动属性。
现在,当Attribute.Equals
方法反映A2
访问所有实例字段(Attribute.Equals不反映属性)时,它将不会“看到”中声明的私有后备字段A1
,因为无法通过派生方法访问基本类型的私有成员。类型。(另请参见此处:私有成员是否在C#中继承?)
因此,当尝试A2
使用Attribute.Equals实现比较两个类型本身没有声明任何字段的实例时,结果将是true
(因为两个属性实例的类型是相同的type A2
,并且这些实例不具有通过该A2
类型可以访问的任何字段)。
可能的解决方案(取决于当前的实际应用场景)可能是(其中包括)使用公共字段而不是属性类中的公共属性,或者覆盖Equals()
基本属性类(A1
)中的方法,该方法反映并比较类型,所有公共字段以及两个属性实例的所有公共属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句