Подтвердить что ты не робот

Интерфейс - реализация анонимного класса в С#?

Есть ли конструкция в С#, которая позволяет вам создать анонимный класс, реализующий интерфейс, как в Java?

4b9b3361

Ответ 1

Как уже было сказано, нет, это невозможно. Тем не менее, вы можете создать класс, который реализует желаемый интерфейс и принимает лямбда в конструкторе, чтобы вы могли превратить лямбда в класс, реализующий интерфейс. Пример:

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

Нет. С# не поддерживает анонимные классы (кроме анонимных типов, которые не могут определять методы).

Ответ 3

Нет, выражение Lambda Expression не может реализовать никаких дополнительных интерфейсов, чем это уже делает.

Вы также сравниваете неправильные вещи. Я предполагаю, что вы действительно хотели спросить, могут ли анонимные типы в С# реализовать интерфейсы. Ответ на это тоже нет.