Domanda

Supponiamo di avere un assembly DLL, contenente una classe generata automaticamente con due metodi:

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

I metodi potrebbero essere qualsiasi cosa, davvero. Quanto sopra è solo un'illustrazione.

Che tipo di codice dovrei generare al posto di ??? sopra per impacchettare automaticamente i parametri della chiamata e inviarli a un singolo metodo generico su un'altra classe, che quindi gestirà effettivamente la chiamata e restituirà il risultato?

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

Credo di cercare qualcosa che funzioni in modo simile a Expression<Func<...>> in LINQ, che si compila in una struttura di dati che può essere inviata ovunque e smontata lì.

Vorrei mantenere i prototipi del metodo originale come se fossero normali metodi implementati localmente, tuttavia, per mantenere il chiamante di AutoGeneratedClass non più saggio.

Se ciò non è possibile, quali sono le mie opzioni?

Grazie!

È stato utile?

Soluzione

Devi avere una lezione? La vita sarebbe molto più semplice usando le interfacce - puoi quindi usare System.Runtime.Remoting.Proxies.RealProxy o eventualmente creare un nuovo tipo su richiesta. Credo che Rhino.Mocks fa quest'ultimo (usando una libreria per fare il lavoro pesante) - e se puoi usare un'interfaccia, vedere come viene implementato Rhino.Mocks potrebbe essere un buon punto di partenza.

Altri suggerimenti

Prenderò una pugnalata nel buio qui poiché non sono sicuro di quali siano tutti i tuoi limiti. Sembra un buon caso per metodi parziali / classe parziale per la tua classe generata automaticamente. (Nota che non ho funzionato così bene attraverso un compilatore, quindi probabilmente ha bisogno di un po 'di pulizia.)

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...
    }
}

Starò lontano dalla parte di espressione simile a LINQ del gestore generico poiché sto ancora lavorando su espressioni di trekking. Tuttavia qualcosa da considerare è quanto sarà difficile / facile mantenere la GenericClass se segui il percorso di espressione simile a LINQ?

La mia esperienza è stata che parecchi sviluppatori non si sentono a proprio agio con i delegati e le espressioni di lamba. Si arrabbiano (letteralmente) quando guardano il codice che usa le espressioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top