如何在IComparer.Compare方法上将'object'转换为Class类型

时间:2010-10-15 14:10:58

标签: c# .net casting icomparer

我正在实施

int IComparer.Compare(object x, object y);

来自IComparer接口。我知道对象的类型是Class1,我知道它的一个成员是class1Instance.myDate,类型为DateTime。

我想要做的是:

DateTime.Compare( (Class1)x.myDate, (Class1)y.myDate);

但是以这种方式投射不起作用。以下是否有其他选择?

Class1 x2 = x as Class1;

9 个答案:

答案 0 :(得分:4)

尝试以下方法:

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate); 

答案 1 :(得分:4)

它可能只是cast和方法调用的优先顺序。你尝试过这样的事吗?

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate);

答案 2 :(得分:2)

这可能是分裂的头发,但你可以这样做:

DateTime.Compare((x as Class1).myDate, (y as Class1).myDate))

答案 3 :(得分:2)

最好的解决方案是扩展Comparer<Class1>

Comparer<T>是一个抽象类,它实现IComparer的通用和非泛型版本。扩展它的优点是您不必实现非泛型IComparer.Compare方法;它已经明确地由基类实现。

public class Class1Comparer: Comparer<Class1>
{
   public override int Compare(Class1 x, Class1 y)
   {
      //null-checks here          
      return DateTime.Compare(x.myDate, y.myDate);
   }
}

答案 4 :(得分:1)

((Class1)x).myDate

答案 5 :(得分:1)

无例外方式:

Class1 c1 = null;
if (x is Class1) c1 = (Class1)x;

答案 6 :(得分:1)

如果您希望Comparer是强类型的,请使用通用版本。

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

的IComparer

所以你将它实现为:

public class MyComparer : IComparer<Class1>
{
    public int Compare( Class1 x, Class1 y )
    {
        // do comparison stuff here.
    }
}

答案 7 :(得分:1)

您可能想要这样做:

DateTime.Compare( ((Class1)x).myDate, (Class1)y).myDate);

你拥有它的方式是尝试将日期字段转换为Class1

答案 8 :(得分:1)

如果由于某种原因你不打算比较异构类型,我总是建议结合泛型和更通用(嗯,嗯“泛型”将是正确的英文单词,愚蠢的.NET术语)非 - 一类中的通用方法,从非泛型调用泛型。大多数通用排序都支持泛型方法,但非泛型方法将用于非泛型类型(例如ArrayList),如果它出现的话。这也是2行的问题,并且在逻辑上是合理的,因此在这种情况下我不会与YAGNI保持一致。

检查空参数也是一个好主意,即使您不期望它们也是如此。我没有这么做就被抓了几次,甚至可以通过一些算法“人为地”引入它们。

public class Class1Comparer : IComparer<Class1>, IComparer
{
  public int Compare(Class1 x, Class1 y)
  {
    if(x == null)
      return y == null ? 0 : -1;
    if(y == null)
      return 1;
    return DateTime.Compare(x.myDate, y.myDate);
  }
  public int Compare(object x, object y)
  {
    //This has no type-checking because you said above it isn't needed. I would normally add some just in case.
    return Compare((Class1)x, (Class1)y);
  }
}