Pregunta

Digamos que tengo un ensamblado de DLL, que contiene una clase autogenerada con dos métodos:

public class AutoGeneratedClass
{
    public int DoSomething(bool forReal) { ??? }
    public void DoSomethingElse(string whatever) { ??? }
}

Los métodos podrían ser cualquier cosa, de verdad. Lo anterior es solo una ilustración.

¿Qué tipo de código necesitaría generar en lugar de ??? anterior para que empaquete automáticamente los parámetros de la llamada y los envíe a un único método genérico en otra clase, que luego manejaría la llamada y devolvería el resultado?

public class GenericClass
{
    public ??? GenericHandler(???) { ??? }
}

Supongo que estoy buscando algo que funcione de manera similar a Expression<Func<...>> en LINQ, que se compila en una estructura de datos que puede enviarse a cualquier parte y desmontarse allí.

Sin embargo, me gustaría mantener los prototipos de métodos originales como si fueran métodos normales implementados localmente, para que la persona que llama a AutoGeneratedClass no sea la más inteligente.

Si esto no se puede lograr, ¿cuáles son mis opciones?

¡Gracias!

¿Fue útil?

Solución

¿Tienes que tener una clase? La vida sería mucho más fácil usando interfaces: puede usar System.Runtime.Remoting.Proxies.RealProxy o posiblemente cree un nuevo tipo a pedido. Creo que Rhino.Mocks hace lo último (usando una biblioteca para hacer el trabajo pesado) - y si puede usar una interfaz, ver cómo se implementa Rhino.Mocks puede ser un buen punto de partida.

Otros consejos

Voy a apuñalar en la oscuridad aquí, ya que no estoy seguro de cuáles son todas sus limitaciones. Esto suena como un buen caso para métodos parciales / clase parcial para su clase AutoGenerated. (Tenga en cuenta que no he ejecutado esto bien a través de un compilador, por lo que probablemente necesite un poco de limpieza).

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal);
    public int DoSomething(bool forReal)
    {
        //some generated code against error conditions??
        return ProcessDoSomething(forReal)
    }

    .....
}

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal)
    {
        //call the generic handler...
    }
}

Me mantendré alejado de la parte de expresión similar a LINQ del controlador genérico ya que todavía estoy trabajando en expresiones de grokking. Sin embargo, algo a tener en cuenta es ¿qué tan difícil / fácil será mantener su GenericClass si sigue la ruta de expresión tipo LINQ?

Mi experiencia ha sido que bastantes desarrolladores no se sienten cómodos con los delegados y las expresiones de lamba. Se encogen (literalmente) cuando miran el código que usa Expresiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top