¿Puede la clase anónima implementar una interfaz?
¿Es posible que un tipo anónimo implemente una interfaz?
Tengo un fragmento de código que me gustaría trabajar, pero no sé cómo hacerlo.
He recibido un par de respuestas que dicen que no o que crean una clase que implementa la interfaz y construye nuevas instancias de eso. Esto no es realmente ideal, pero me pregunto si existe un mecanismo para crear una clase dinámica delgada encima de una interfaz que simplificaría esto.
public interface DummyInterface
{
string A { get; }
string B { get; }
}
public class DummySource
{
public string A { get; set; }
public string C { get; set; }
public string D { get; set; }
}
public class Test
{
public void WillThisWork()
{
var source = new DummySource[0];
var values = from value in source
select new
{
A = value.A,
B = value.C + "_" + value.D
};
DoSomethingWithDummyInterface(values);
}
public void DoSomethingWithDummyInterface(IEnumerable<DummyInterface> values)
{
foreach (var value in values)
{
Console.WriteLine("A = '{0}', B = '{1}'", value.A, value.B);
}
}
}
Encontré un artículo Ajuste de interfaz dinámica que describe un enfoque. ¿Es esta la mejor manera de hacerlo?
No, los tipos anónimos no pueden implementar una interfaz. De la guía de programación de C# :
Los tipos anónimos son tipos de clase que constan de una o más propiedades públicas de solo lectura. No se permiten otros tipos de miembros de clase, como métodos o eventos. Un tipo anónimo no se puede convertir a ninguna interfaz o tipo excepto a un objeto.
Si bien todas las respuestas en el hilo son bastante ciertas, no puedo resistir la tentación de decirle que, de hecho, es posible que una clase anónima implemente una interfaz, aunque se necesita un poco de trampa creativa para llegar allí.
En 2008, estaba escribiendo un proveedor LINQ personalizado para mi entonces empleador, y en un momento necesitaba poder distinguir "mis" clases anónimas de otras anónimas, lo que significaba que implementaran una interfaz que pudiera usar para escribir comprobaciones. a ellos. La forma en que lo resolvimos fue usando aspectos (usamos PostSharp ), para agregar la implementación de la interfaz directamente en IL. Entonces, de hecho, permitir que clases anónimas implementen interfaces es factible , solo necesitas modificar ligeramente las reglas para lograrlo.
Transmitir tipos anónimos a interfaces ha sido algo que he querido por un tiempo, pero desafortunadamente la implementación actual te obliga a tener una implementación de esa interfaz.
La mejor solución es tener algún tipo de proxy dinámico que cree la implementación por usted. Usando el excelente proyecto LinFu puedes reemplazar
select new
{
A = value.A,
B = value.C + "_" + value.D
};
con
select new DynamicObject(new
{
A = value.A,
B = value.C + "_" + value.D
}).CreateDuck<DummyInterface>();
Los tipos anónimos pueden implementar interfaces a través de un proxy dinámico.
Escribí un método de extensión en GitHub y una publicación de blog http://wblo.gs/feE para respaldar este escenario.
El método se puede utilizar así:
class Program
{
static void Main(string[] args)
{
var developer = new { Name = "Jason Bowers" };
PrintDeveloperName(developer.DuckCast<IDeveloper>());
Console.ReadKey();
}
private static void PrintDeveloperName(IDeveloper developer)
{
Console.WriteLine(developer.Name);
}
}
public interface IDeveloper
{
string Name { get; }
}