2014-01-03 2 views
0

Я работаю над проектом, написанным на 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 имеют типа A и cp является enum свойств:

enum Properties 
{ Prop1, Prop2, Prop3, Prop4 } 

Далее я делаю тест на равенство:

if (!value1.Equals(value2)) 
{ 
    // Handle differences 
} 

При проверке Prop4, который возвращает массив, Equals() всегда возвращает ложь, даже если размер массива и содержание же.

Самый простой способ определить, что возвращаемый тип перечислим, а затем выполнить проверку равенства для отдельных элементов перечислимого?

ответ

3

Вы можете использовать Type.IsAssignableFrom() метод:

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

} 

Я не 100% уверен, что вы пытаетесь достичь, используя свою технику, но получение значений свойств с помощью отражения с дополнительным enum кажется как плохое дизайнерское решение.

Update

Если у вас есть код классов вы должны просто реализовать 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); 
    } 
} 
+0

Я также согласен с Марцином в использовании рефлексии для получения значений свойств, но, опять же, не уверен, какова конечная цель. –

+0

Мне тоже не нравится дизайн, но пока я не смог найти лучшего способа. Я должен реализовать функцию сравнения для двух объектов одного типа. Это не будет полным сравнением пополам. Скорее, нужно сравнить только фиксированное подмножество свойств. Например, класс A имеет 40 свойств, из которых 25 будут включены для сравнения равенств. Это требование. Есть ли лучший способ разработать это? C# не является моим основным языком. – Donotalo

+0

У вас есть код классов? – MarcinJuraszek

Смежные вопросы