要么是我遗漏了什么,要么是 .NET 不支持 Java 的功能。我希望能够避免为了实现一个小接口(interface)而创建一个小类。例如,LINQ 的 Except 方法需要 IEqualityComparer
。所以我不得不写一个实现接口(interface)的小类。但是在 Java 中,我可以简单地做一个 new IEqualityComparer() {//interface declarations }
并完成它。所以有什么问题?
这与这篇文章有些相关:
Can a C# anonymous class implement an interface? .
补充:
目前,我为 Equals
和 GetHashCode
添加了覆盖。
最佳答案
你是对的,与 Java 不同,C# 不支持可以实现接口(interface)的匿名内部类的概念。我遇到了与 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);
}
}
现在在我想要动态的地方IEqualityComparer<T>
我可以做以下事情
var comparer = Utils.CreateEqualityComparer<Student>(
(left, right) => left.Name == right.Name,
value => value.Name.GetHashCode());
关于c# - 为什么不允许在 .NET 中就地实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877017/