2012-03-22 34 views
19

Esiste un costrutto in C# che consente di creare una classe anonima implementando un'interfaccia, proprio come in Java?Interfaccia: implementazione della classe anonima in C#?

+0

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

+0

Stai confondendo espressioni lambda (funzioni anonime) con classi anonime. Non ha senso per una funzione implementare le interfacce – dtech

risposta

25

Come è già stato detto, no, questo non è possibile. Tuttavia, puoi creare una classe che implementa l'interfaccia desiderata e accetta una lambda nel suo costruttore in modo da poter trasformare un lambda in una classe che implementa l'interfaccia. Esempio:

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

Usage (ovviamente non fare nulla utile, ma si ottiene l'idea)

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

Ooh, un po 'di fantasia! –

+2

questa è la soluzione migliore per questo problema che ho già visto, genio –

+1

soluzione molto interessante. Lo svantaggio principale è che devi creare una classe base per ogni interfaccia. C'è un modo semplice per renderlo generico? –

6

No. C# non supporta le classi anonime (tranne i tipi anonimi che non possono definire i metodi).

2

No, un'espressione Lambda non può implementare interfacce aggiuntive rispetto a quelle già esistenti.

Stai anche confrontando le cose sbagliate. Immagino che tu abbia davvero intenzione di chiedere se i tipi anonimi in C# possono implementare interfacce. La risposta è anche no.

Problemi correlati