In un metodo di classe, A, ho bisogno di chiamare un metodo di libreria B, che prende come parametro IProgress<Object>
.C# È possibile fornire un lambda quando è richiesta un'interfaccia?
Normalmente, potrei implementare IProgress<Object>
come parte della classe in cui si trova A e quindi passare "questo" al metodo B. O forse potrei creare una nuova classe il cui unico scopo è implementare IProgress<Object>
e gestirlo correttamente-- quindi in questo caso creerò un'istanza di quella classe e la passerò a B.
Ma quello che voglio veramente è che la mia implementazione di IProgress<Object>
appaia proprio all'interno del metodo in cui sto chiamando B, quindi che c'è meno di una disconnessione visiva tra il codice chiamante e l'implementazione IProgress<Object>
. (Considero la mia implementazione di IProgress come una sorta di dettaglio privato e non condiviso del metodo di chiamata e quindi non voglio che la mia implementazione di IProgress<Object>
sia in un metodo completamente separato di forse un'intera altra classe).
Quello che ho cercato di fare è utilizzare un lambda in cui io definire la mia breve corso di movimentazione, e quindi in qualche modo passare questo lambda a B, in questo modo:
method in class A {
...
Action<Object> Report = (m) => { // do something useful with m };
B(Report)
}
method B(IProgress<Object> reporter) {
reporter.Report(some object)
}
Certo, lo so perché questo non funzionerà così com'è - B sta volendo un oggetto che implementa IProgress<Object>
e sto passando un oggetto Azione invece.
C'è un modo per ottenere ciò che sto cercando di ottenere? (IE hanno mia implementazione se IProgress<Object>
apparire all'interno metodo A?
C# lambda sono delegati anonimi . Quello di cui hai bisogno è un tipo anonimo che implementa l'interfaccia. Vedi [questa domanda] (http://stackoverflow.com/questions/191013/can-a-c-sharp-anonymous-class-implement-an-interface) per alcune soluzioni alternative rispetto ai soli tipi anonimi di proprietà pubbliche forniti da C#. –