2010-06-14 19 views
14

implementar tengo el siguiente código dentro de un método:clase anónima interfaz

var list = new[] 
    { 
    new { Name = "Red", IsSelected = true }, 
    new { Name = "Green", IsSelected = false }, 
    new { Name = "Blue", IsSelected = false }, 
    }; 

quisiera llamar a una función que requiere una lista de elementos con cada elemento de la implementación de una interfaz (ISelectable). Sé cómo se hace esto con clases normales, pero en este caso solo intento completar algunos datos de demostración.

¿Es posible crear una clase anónima que implemente una interfaz?

así:

new { Name = "Red", IsSelected = true } : ISelectable 

Respuesta

12

No, esto no es posible.

Un tipo anónimo está destinado a ser un objeto de transporte liviano internamente. En el momento en que requiera más funcionalidad que la que brinda la pequeña sintaxis, debe implementarla como un tipo con nombre normal.

Cosas como implementaciones de herencia e interfaz, atributos, métodos, propiedades con código, etc. No es posible.

1

Incluso si pudieras hacer esto, casi seguro que no querrías, ya que un método podría saber todo sobre la clase anónima (es decir, no hay encapsulamiento y tampoco ningún beneficio al acceder a las cosas indirectamente).

Por otro lado, he pensado en cómo se vería esa característica (potencialmente útil si quiero pasar un objeto anotado de forma anónima a un método esperando una interfaz particular ... o al menos eso pensé).

La sintaxis más mínimo para un tipo anónimo que hereda una interfaz IFoo sería algo así como

new {IFoo.Bar = 2} // if IFoo.Bar is a property 

or 

new {IFoo.Bar() =() => do stuff} if IFoo.Bar is a method 

Pero este es el caso simple donde IFoo sólo tiene una propiedad o método. En general, debería implementar todos de miembros de IFoo; incluyendo propiedades de lectura/escritura y eventos que actualmente ni siquiera son posibles en objetos anónimos.

+0

Es cierto, eso sería genial. Quizás especifique la interfaz de la clase anónima como esta: new {IFoo.Bar = 2}: IFoo; – flayn

12

El marco de código abierto impromptu-interface le permitirá hacer esto de manera efectiva con un proxy liviano y el DLR.

new { Name = "Red", IsSelected = true}.ActLike<ISelectable>(); 
+1

¡Esto es asombroso! Estoy jugando con él en LINQPad y funciona genial hasta ahora. – flayn

Cuestiones relacionadas