2016-03-31 12 views
0

私は一般的な比較機能を実行しようとしていますが、何がうまくいかないのか分かりません。一般的なIComparerをテストする

比較演算のコード:

namespace Pract_02 
{ 
    public class ComparerProperty<T> : IComparer<T> 
    { 
     private String attribute; 
     public ComparerProperty(String text) 
     { 
      attribute = text; 
     } 
     public int Compare(T x, T y) 
     { 
      PropertyDescriptor property = GetProperty(attribute); 
      IComparable propX = (IComparable)property.GetValue(x); 
      IComparable propY = (IComparable)property.GetValue(y); 
      return propX.CompareTo(propY); 

     } 

     private PropertyDescriptor GetProperty(string name) 
     { 
      T item = (T)Activator.CreateInstance(typeof(T)); 
      PropertyDescriptor propName = null; 
      foreach (PropertyDescriptor propDesc in TypeDescriptor.GetProperties(item)) 
      { 
       if (propDesc.Name.Contains(name)) propName = propDesc; 
      } 
      return propName; 
     } 
    } 
} 

そして、これは私のテストコードです:

私はそれをテストする際の問題は、私は

「System.MissingMethodExceptionを受けている

public void TestComparer() 
    { 
     SortedSet<Vehicle> list = new SortedSet<Vehicle>(new ComparerProperty<Vehiculo>("NumWheels")); 
     Car ca = new Car(); 
     Moto mo = new Moto(); 
     Tricycle tri = new Tricycle(); 
     list.Add(tri); 
     list.Add(ca); 
     list.Add(mo); 
     IEnumerator<Vehiculo> en = list.GetEnumerator(); 
     en.MoveNext(); 
     Assert.AreEqual(en.Current, mo); 
     en.MoveNext(); 
     Assert.AreEqual(en.Current, tri); 
     en.MoveNext(); 
     Assert.AreEqual(en.Current, ca); 


    } 

:することはできません抽象クラスを作成してください。 "ここで

私の車と車のクラスのコードです:あなたは抽象クラスの車両からインスタンスを作成しようとしていた間、

public abstract class Vehicle 
{ 
    public abstract int NumWheels 
    { 
     get; 
    } 
} 

public class Car : Vehicle 
{ 
    public override int NumWheels 
    { 
     get 
     { 
      return 4; 
     } 
    } 
} 
+2

を得るIComparableをされていない場合。 'Vehicle'は抽象ですので、例外が発生します。探しているプロパティを取得するために新しいインスタンスを構築する必要はありません。 – Lee

答えて

2

MissingMethodExceptionが発生しました。問題はラインである:あなたがしようとした場合

  • T item = (T)Activator.CreateInstance(typeof(T)); 
    

    あなたはところで問題

    PropertyDescriptor propName = null; 
    foreach (PropertyDescriptor propDesc in TypeDescriptor.GetProperties(typeof(T))) 
    { 
        if (propDesc.Name.Contains(name)) propName = propDesc; 
    } 
    
    return propName; 
    

    を解決するために、次のコードを使用することができ、あなたのアプローチは、他のいくつかの問題などがあります既存のプロパティを比較するNullReferenceException

  • null nullプロパティを比較しようとすると、NullReferenceExceptionも発生する
  • プロパティは、あなたがGetProperty` `新しい` Vehicle`インスタンスを構築しようとし `ComparerProperty を作成している` InvalidCastExceptionが
+0

それは私の問題を非常に多くの感謝を解決! –

関連する問題