为什么同一属性的两个不同实例在这里相等?

t3chb0t

我有两个类,它们的属性相同但值不同。当我将它们转储到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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章