测试通用 IComparer
Testing a generic 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: Cannot create an abstract class."
这是我的车辆和汽车的代码 类:
public abstract class Vehicle
{
public abstract int NumWheels
{
get;
}
}
public class Car : Vehicle
{
public override int NumWheels
{
get
{
return 4;
}
}
}
当您尝试从抽象 class 车辆创建实例时发生 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 属性 你也会得到 NullReferenceException
- 如果 属性 不是 IComparable 你得到 InvalidCastException
我正在尝试做一个通用比较器,但我不确定出了什么问题。
比较器代码:
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: Cannot create an abstract class."
这是我的车辆和汽车的代码 类:
public abstract class Vehicle
{
public abstract int NumWheels
{
get;
}
}
public class Car : Vehicle
{
public override int NumWheels
{
get
{
return 4;
}
}
}
当您尝试从抽象 class 车辆创建实例时发生 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 属性 你也会得到 NullReferenceException
- 如果 属性 不是 IComparable 你得到 InvalidCastException