要么我丢失了一些东西,要么.NET不支持Java做什么。我希望能够避免仅仅为了实现一个小接口而创建一个小类。例如,linq的except方法需要IEqualityComparer。所以我不得不编写一个实现接口的小类。然而,在Java中,我可以简单地做一个new IEqualityComparer() { //interface declarations }并完成它。有什么问题吗?
这与本文有些关系:
Can a C# anonymous class implement an interface?
添加:
目前,我为EqualsGetHashCode添加了覆盖。

最佳答案

你是正确的,C不像Java,不支持可以实现接口的匿名内部类的概念。我遇到了与IEqualityComparer完全相同的问题,最终得到了以下解决方案。

public static class Utils {
  private sealed class EqualityComparer<T> : IEqualityComparer<T> {
    private readonly Func<T, T, bool> m_equals;
    private readonly Func<T, int> m_getHashCode;
    internal EqualityComparer(
      Func<T, T, bool> equals,
      Func<T, int> getHashCode) {
      m_equals = equals;
      m_getHashCode = getHashCode;
    }
    public bool Equals(T left, T right) {
      return m_equals(left, right);
    }
    public int GetHashCode(T value) {
      return m_getHasheCode(value);
    }
  }

  public static IEqualityComparer<T> CreateEqualityComparer<T>(
    Func<T, T, bool> equals,
    Func<T, int> getHashCode) {
    return new EqualityComparer<T>(equals, getHashCode);
  }
}

现在,在我想要的地方,我可以做以下操作
var comparer = Utils.CreateEqualityComparer<Student>(
  (left, right) => left.Name == right.Name,
  value => value.Name.GetHashCode());

09-25 17:18
查看更多