首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试通用IComparer

测试通用IComparer
EN

Stack Overflow用户
提问于 2016-03-31 11:47:34
回答 1查看 360关注 0票数 0

我试着做一个通用的比较器,我不知道哪里出了问题。

比较者的代码:

代码语言:javascript
复制
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;
        }
    }
}

这是我的测试代码:

代码语言:javascript
复制
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:无法创建抽象类。“

以下是我的汽车和汽车课程的代码:

代码语言:javascript
复制
public abstract class Vehicle
{
    public abstract int NumWheels
    {
        get;
    }
}

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 12:20:12

MissingMethodException发生在您试图从抽象类Vehicle创建实例时。问题是:

代码语言:javascript
复制
T item = (T)Activator.CreateInstance(typeof(T));

您可以使用以下代码来解决问题

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36332569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档