变量的平等测试

时间:2014-01-03 06:04:44

标签: c# .net

我正在研究用C#和.NET 4.0编写的项目。

有一个函数可以比较两个对象的某些属性。两个对象都是相同的类型。考虑以下课程:

class A
{
    public UInt32 Prop1 {get; set;}
    public byte Prop2 {get; set;}
    public string Prop3 {get; set;}
    public int[] Prop4 {get; set;}
}

在我的比较函数中,我使用反射迭代每个属性,并获取属性的值:

var value1 = t1.GetType().GetProperty(cp.ToString()).GetValue(t1, null);
var value2 = t2.GetType().GetProperty(cp.ToString()).GetValue(t2, null);

其中t1t2的{​​{1}}类型和A属性cp

enum

接下来我正在进行平等测试:

enum Properties
{ Prop1, Prop2, Prop3, Prop4 }

当测试返回数组的if (!value1.Equals(value2)) { // Handle differences } 时,Prop4总是返回false,即使数组大小和内容相同。

检测返回类型是否可枚举的最简单方法是什么,然后对可枚举的各个元素执行相等测试?

1 个答案:

答案 0 :(得分:3)

您可以使用Type.IsAssignableFrom()方法:

if(typeof(IEnumerable).IsAssignableFrom(t2.GetType()))
{

}

我并非100%确定您使用的技术尝试实现的目标,但使用带有额外enum的反射来获取属性值似乎是糟糕的设计决策。

<强>更新

如果你拥有类代码,你应该只实现IEquatable<T>并比较那里的所有属性。

class A : IEquatable<A>
{
    public UInt32 Prop1 { get; set; }
    public byte Prop2 { get; set; }
    public string Prop3 { get; set; }
    public int[] Prop4 { get; set; }

    public bool Equals(A other)
    {
        return other != null
            && Prop1 == other.Prop1
            && Prop2 == other.Prop2
            && Prop3 == other.Prop3
            && System.Linq.Enumerable.SequenceEqual(Prop4, other.Prop4);
    }
}