2012-03-22 16 views
19

Czy istnieje konstrukt w języku C#, który umożliwia tworzenie anonimowej klasy implementującej interfejs, tak jak w Javie?Interfejs implementujący anonimową klasę w języku C#?

+0

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

+0

Mylicie wyrażenia lambda (funkcje anonimowe) z anonimowymi klasami. Nie ma sensu funkcja zaimplementowania interfejsów – dtech

Odpowiedz

25

Jak już stwierdzono, nie, nie jest to możliwe. Można jednak utworzyć klasę, która implementuje żądany interfejs i akceptuje lambda w jego konstruktorze, dzięki czemu można przekształcić lambdę w klasę implementującą interfejs. Przykład:

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

użycia (oczywiście nic nie robi pomocny, ale masz pomysł)

var list = new List<string>() { "a", "c", "a", "F", "A" }; 
list.Distinct(new LambdaComparer<string>((a,b) => a == b)); 
+2

Ooh, trochę wymyślne! –

+2

jest to najlepsze rozwiązanie dla tego problemu, które widziałem, geniusz –

+1

bardzo fajne rozwiązanie. Główną wadą jest stworzenie klasy bazowej dla każdego interfejsu. Czy istnieje jakiś prosty sposób, aby uczynić go ogólnym? –

6

Nie. C# nie obsługuje klas anonimowych (z wyjątkiem anonimowych typów, które nie mogą definiować metod).

2

Nie, Lambda Expression nie może zaimplementować żadnych dodatkowych interfejsów niż to, co już robi.

Porównujesz także złe rzeczy. Zgaduję, że naprawdę chciałeś zapytać, czy anonimowe typy w języku C# mogą implementować interfejsy. Odpowiedź na to również nie.

Powiązane problemy