C#中实现接口的匿名类是什么?

24

C# 中是否有一种构造方式可以创建一个实现接口的匿名类,就像 Java 中的那样?


相关问题:https://dev59.com/z3VC5IYBdhLWcg3ww0Hr - mcabral
你混淆了lambda表达式(匿名函数)和匿名类。对于一个函数来实现接口是没有意义的。 - dtech
3个回答

32

正如已经提到的,不,这是不可能的。但是,您可以创建一个实现所需接口并在其构造函数中接受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));

2
哦,有点花哨! - Michael Rodrigues
2
这是我目前看到的最好的解决方案,真是天才。 - Willem D'Haeseleer
1
非常酷的解决方案。主要缺点是您必须为每个接口创建一个基类。有没有简单的方法使其通用化? - Louis Rhys
1
@LouisRhys 简单来说,不行。你需要通过直接发出它的 IL 代码,在编译时创建新的具体类型。这将会相当困难。 - Servy
+1。类似于这里的解决方案https://dev59.com/S2ox5IYBdhLWcg3w1Xs3#8941871。 - nawfal
1
@nawfal 是的,这个模式已经流传了一段时间。我在不同的地方看到过它被使用了很多次。 - Servy

6
不,C#不支持匿名类(除了无法定义方法的匿名类型)。

2

不,Lambda表达式不能实现任何额外的接口。

你比较的对象也是错误的。我猜你真正想问的是C#中的匿名类型能否实现接口。答案也是否定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接