¿Puede la clase anónima implementar una interfaz?

Resuelto Nick Randell asked hace 16 años • 10 respuestas

¿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?

Nick Randell avatar Oct 10 '08 19:10 Nick Randell
Aceptado

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.

HasaniH avatar Oct 10 '2008 12:10 HasaniH

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.

Mia Clarke avatar Sep 17 '2010 11:09 Mia Clarke

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>();
Arne Claassen avatar Nov 03 '2008 06:11 Arne Claassen

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; }
}
Jason Bowers avatar Nov 09 '2014 05:11 Jason Bowers