2016-03-31 2 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; 
     } 
    } 
} 

И это мой тестовый код:

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); 


    } 

Проблема, когда я проверить его я получаю

«System.MissingMethodException: Не могу создать абстрактный класс ».

Вот код для моего автомобиля и автомобиля класса:

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

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

Вы создаете '' ComparerProperty , которая пытается построить новый 'Vehicle' экземпляр в' GetProperty'. 'Vehicle' является абстрактным, поэтому вы получаете исключение. Вам не нужно будет создавать новый экземпляр, чтобы получить искомое свойство. – Lee

ответ

2

MissingMethodException произошел в то время как вы пытаетесь создать экземпляр от абстрактного класса Vehicle. Проблема находится на линии:

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, вы получите также NullReferenceException
  • Если свойство не IComparable вы получите InvalidCastException
+0

Это решило мою проблему так много спасибо! –