11

我正在尝试编写一个用于排序的通用对象比较器,但我注意到它不处理它比较的值之一为空的实例。当一个对象为空时,我希望它像空字符串一样对待它。我尝试将 null 值设置为 String.Empty,但是在调用 CompareTo() 时出现“对象必须是字符串类型”的错误。

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

我现在很坚持这个!任何帮助,将不胜感激。

4

4 回答 4

22

除非您的 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);
于 2011-01-31T15:18:52.480 回答
4
if (SortDirection == SortDirection.Ascending)
    return Comparer<T>.Default.Compare(obj1, obj2);
else
    return Comparer<T>.Default.Compare(obj2, obj1);
于 2011-01-31T15:27:31.847 回答
0

因为T是泛型类型,所以不能给它String赋值;您只能为其分配 type 的值T。如果您只打算使用它来比较字符串,请使用String而不是T. 否则,添加空检查并决定顺序null应该落在哪里。

于 2011-01-31T15:05:32.983 回答
0
IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null) ?? "";
IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null) ?? "";

这基本上意味着 obj1 现在将是 propertyInfo.GetValue(x, null) 的值,或者,如果碰巧为 null,则 obj1 将是“”。

或者,如果问题是 GetValue 在 null 上崩溃,您可以执行以下操作:

IComparable obj1 = "";
try { obj1 = (IComparable)propertyInfo.GetValue(x, null); } catch {}
于 2011-01-31T15:09:43.300 回答