如何使我的通用比较器(IComparer)处理空值?

Nic*_*ckG 10 .net c# sorting icomparer

我正在尝试编写用于排序的通用对象比较器,但我注意到它不处理其中一个值比较的实例为null的实例.当一个对象为null时,我希望它对待它与空字符串相同.我已经尝试将null值设置为String.Empty,但是当我调用CompareTo()时,我得到"Object必须是String类型"的错误.

public int Compare(T x, T y)
{
    PropertyInfo propertyInfo = typeof(T).GetProperty(sortExpression);
    IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
    IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);

    if (obj1 == null) obj1 = String.Empty; // This doesn't work!
    if (obj2 == null) obj2 = String.Empty; // This doesn't work!

    if (SortDirection == SortDirection.Ascending)
        return obj1.CompareTo(obj2);
    else
        return obj2.CompareTo(obj1);
}
Run Code Online (Sandbox Code Playgroud)

我现在非常坚持这个!任何帮助,将不胜感激.

Ant*_*ram 20

T除非你的T被有效地限制为一个字符串,否则你不能将你视为一个空字符串.你应该做的是有一个比较空值的计划.如

if (obj1 == null && obj2 == null)
   return 0;
else if (obj1 == null)
   return -1;
else if (obj2 == null)
   return 1;
else 
   return obj1.CompareTo(obj2);
Run Code Online (Sandbox Code Playgroud)