我正在研究用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);
其中t1
和t2
的{{1}}类型和A
属性cp
:
enum
接下来我正在进行平等测试:
enum Properties
{ Prop1, Prop2, Prop3, Prop4 }
当测试返回数组的if (!value1.Equals(value2))
{
// Handle differences
}
时,Prop4
总是返回false,即使数组大小和内容相同。
检测返回类型是否可枚举的最简单方法是什么,然后对可枚举的各个元素执行相等测试?
答案 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);
}
}