接口 - 在C#中实现匿名类?

时间:2012-03-22 14:37:02

标签: c# anonymous-class

C#中是否有一个构造允许您创建一个实现接口的匿名类,就像在Java中一样?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:6)

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

答案 2 :(得分:2)

不,Lambda Expression无法实现任何额外的接口。

你也在比较错误的事情。我猜你真的想问一下C#中的匿名类型是否可以实现接口。对此的答案也是否定的。