21

이 질문에는 이미 답변이 있습니다.

C #에서 Java에서와 같이 인터페이스를 구현하는 익명 클래스를 만들 수있는 구문이 있습니까?


3 답변


31

이미 언급했듯이, 불가능합니다. 그러나 원하는 인터페이스를 구현하는 클래스를 만들 수 있으며 생성자에서 람다를 받아 들여 람다를 인터페이스를 구현하는 클래스로 바꿀 수 있습니다. 예:

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));


  • 오, 조금 공상! - Michael Rodrigues
  • 이것은 내가 본이 문제에 대한 최상의 해결책이다. 천재 - Willem D'Haeseleer
  • 아주 멋진 솔루션. 가장 큰 단점은 모든 인터페이스에 대한 기본 클래스를 만들어야한다는 것입니다. 일반화하기위한 간단한 방법이 있습니까? - Louis Rhys
  • @ 루이스 리쉬 간단합니다. 컴파일시에 IL 코드를 직접 출력하여 새로운 콘크리트 유형을 생성해야합니다. 그렇게하는 것이 상당히 어려울 것입니다. - Servy
  • @nawfal 예, 그 패턴은 잠시 떠 다니고 있습니다. 여러 곳에서 여러 번 사용 된 것을 보았습니다. - Servy

6

C #은 익명 클래스 (메서드를 정의 할 수없는 익명 형식 제외)를 지원하지 않습니다.


2

아니요, Lambda Expression은 이미 수행 한 것보다 추가 인터페이스를 구현할 수 없습니다.

당신은 또한 잘못된 것들을 비교하고 있습니다. C #의 익명 형식이 인터페이스를 구현할 수 있는지 여부를 묻는 것입니다. 그것에 대한 대답도 아니오입니다.

연결된 질문


관련된 질문

최근 질문