【发布时间】:2012-03-22 14:37:02
【问题描述】:
在 C# 中是否有一个构造允许您创建一个实现接口的匿名类,就像在 Java 中一样?
【问题讨论】:
-
您将 lambda 表达式(匿名函数)与匿名类混淆了。函数实现接口是没有意义的
标签: c# anonymous-class
在 C# 中是否有一个构造允许您创建一个实现接口的匿名类,就像在 Java 中一样?
【问题讨论】:
标签: c# anonymous-class
如前所述,不,这是不可能的。但是,您可以创建一个实现所需接口并在其构造函数中接受 lambda 的类,以便您可以将 lambda 转换为实现该接口的类。示例:
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer,
Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}
用法(显然没有做任何有用的事情,但你明白了)
var list = new List<string>() { "a", "c", "a", "F", "A" };
list.Distinct(new LambdaComparer<string>((a,b) => a == b));
【讨论】:
没有。 C# 不支持匿名类(不能定义方法的匿名类型除外)。
【讨论】:
不,Lambda 表达式不能实现比它已经实现的任何其他接口。
你也在比较错误的东西。我猜你真的想问 C# 中的匿名类型是否可以实现接口。答案是否定的。
【讨论】: