2012-03-22 4 views
19

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

+0

http://stackoverflow.com/questions/191013/can-ac-sharp-anonymous-class -implement-an-interface – mcabral

+0

익명 클래스로 람다 식 (익명 함수)을 혼동합니다. 함수가 인터페이스를 구현하는 것은 의미가 없습니다. – dtech

답변

25

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

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

우와, 조금 공상! –

+2

이것은이 문제에 대한 최선의 해결책입니다. 아직 보았습니다. 천재 –

+1

매우 멋진 해결책입니다. 가장 큰 단점은 모든 인터페이스에 대한 기본 클래스를 만들어야한다는 것입니다. 일반화하기위한 간단한 방법이 있습니까? –

6

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

2

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

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