2010-08-28 2 views
1

J'essaie de comparer deux comp1 de classe, comp2 j'ai utilisé la méthode ci-dessous: ComparerCollection (array_X, array_Y); mais il y a des erreurs ci-dessous. Arraylist généré à partir de Ilist. Comment puis je faire ça?Comment comparer deux objections de classe avec Reflection?

namespace GenericCollecitonComparer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      myClass comp1 = new myClass() { ID = 1, Name = "yusuf" }; 
      myClass comp2 = new myClass() { ID = 1, Name = "yusufk" }; 
      Comparer com = new Comparer(comp1, comp2); 
      Console.ReadKey(); 
     } 
    } 

    public class Comparer 
    { 
     public Comparer(myClass x, myClass y) 
     { 
      PropertyInfo[] propInfo_X = x.GetType().GetProperties(); 
      PropertyInfo[] propInfo_Y = y.GetType().GetProperties(); 
      ArrayList array_X = new ArrayList(); 
      ArrayList array_Y = new ArrayList(); 

      foreach (PropertyInfo pi in propInfo_X) 
       array_X.Add(pi.GetValue(x, null)); 
      foreach (PropertyInfo pi in propInfo_Y) 
       array_Y.Add(pi.GetValue(y, null)); 

      // ComparerCollection(array_X, array_Y); --> Error below 


     } 
     public bool ComparerCollection<T>(IList<T> xlist, IList<T> ylist) 
     { 
      return xlist.SequenceEqual(ylist); 
     } 
    } 

    public class myClass 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 

}

/* Error 1 The type arguments for method ' 
      * GenericCollecitonComparer.Comparer.ComparerCollection<T>(System.Collections.Generic.IList<T>, System.Collections.Generic.IList<T>)' 
      * cannot be inferred from the usage. Try specifying the type arguments explicitly. 
      * 
      */ 

Répondre

1

L'erreur que vous recevez est dû au fait ArrayList n'est pas une classe générique. Vous pouvez utiliser List<object> à la place pour le faire fonctionner.

Une implémentation alternative:

public class Comparer 
{ 
    public bool AreEqual { get; private set; } 

    public Comparer(myClass x, myClass y) 
    { 
     var xProperties = x.GetType().GetProperties(); 
     var yProperties = y.GetType().GetProperties(); 

     var xPropertiesValues = xProperties.Select(pi => pi.GetValue(x, null)); 
     var yPropertiesValues = yProperties.Select(pi => pi.GetValue(y, null)); 

     AreEqual = xPropertiesValues.SequenceEqual(yPropertiesValues); 
    } 
} 

Et un exemple d'utilisation:

[Test] 
public void UsageExample() 
{ 
    myClass comp1 = new myClass() { ID = 1, Name = "yusuf" }; 
    myClass comp2 = new myClass() { ID = 1, Name = "yusufk" }; 
    myClass comp3 = new myClass() { ID = 1, Name = "yusuf" }; 

    Comparer comparerOf1And2 = new Comparer(comp1, comp2); 
    Assert.IsFalse(comparerOf1And2.AreEqual); 

    Comparer comparerOf1And3 = new Comparer(comp1, comp3); 
    Assert.IsTrue(comparerOf1And3.AreEqual); 
}