2012-03-22 19 views
19

¿Hay un constructo en C# que le permite crear una clase anónima implementando una interfaz, como en Java?Interface implementando clase anónima en C#?

+0

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

+0

Estás confundiendo expresiones lambda (funciones anónimas) con clases anónimas. No tiene sentido que una función implemente interfaces – dtech

Respuesta

25

Como ya se ha indicado, no, esto no es posible. Sin embargo, puede crear una clase que implemente la interfaz deseada y acepte una lambda en su constructor para que pueda convertir una lambda en una clase que implemente la interfaz. Ejemplo:

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

Uso (obviamente sin hacer nada útil, pero usted consigue la idea)

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

Ooh, ¡un poco sofisticado! –

+2

esta es la mejor solución para este problema que he visto hasta ahora, genio –

+1

solución muy buena. El principal inconveniente es que debe crear una clase base para cada interfaz. ¿Hay alguna forma simple de hacerlo genérico? –

6

No. C# no admite clases anónimas (excepto los tipos anónimos que no pueden definir métodos).

2

No, una Expresión Lambda no puede implementar ninguna interfaz adicional de la que ya tiene.

También está comparando cosas equivocadas. Supongo que realmente quiso preguntar si los tipos anónimos en C# pueden implementar interfaces. La respuesta a eso también es no.

Cuestiones relacionadas