Anonymous interfaccia di attuazione classe [duplicato]
-
27-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Can anonima implementare l'interfaccia? 9 risposte
Ho il seguente codice all'interno di un metodo:
var list = new[]
{
new { Name = "Red", IsSelected = true },
new { Name = "Green", IsSelected = false },
new { Name = "Blue", IsSelected = false },
};
desidero chiamare una funzione che richiede una lista di elementi con ciascun elemento implementando un'interfaccia (ISelectable). So come si fa con le classi normali, ma in questo caso io sto solo cercando di compilare alcuni dati demo.
E 'possibile creare una classe anonima implementazione di un'interfaccia?
in questo modo:
new { Name = "Red", IsSelected = true } : ISelectable
Soluzione
No, questo non è possibile.
tipoUn anonimo è destinato ad essere un oggetto trasporto leggero internamente. L'istante hai bisogno di più funzionalità rispetto alla piccola della sintassi fornisce, è necessario implementare come un tipo normale di nome.
Cose come eredità e di interfaccia implementazioni, attributi, metodi, proprietà con il codice, ecc non è possibile.
Altri suggerimenti
Il framework open source improvvisato interfaccia vi permetterà di fare in modo efficace questo con un proxy leggero e DLR.
new { Name = "Red", IsSelected = true}.ActLike<ISelectable>();
Anche se si potrebbe fare questo, è quasi certamente non vuole dal momento che un metodo potrebbe sapere tutto sulla classe anonima (vale a dire non v'è alcun incapsulamento e anche nessun beneficio ad accedere cose indirettamente).
D'altra parte, ho pensato a come una tale funzione potrebbe essere (potenzialmente utile se voglio passare un oggetto anonimo tipizzato a un metodo che prevede un particolare interfaccia ... o almeno così pensavo).
La sintassi più minimale per un tipo anonimo che eredita un IFoo un'interfaccia sarebbe qualcosa di simile
new {IFoo.Bar = 2} // if IFoo.Bar is a property
or
new {IFoo.Bar() = () => do stuff} if IFoo.Bar is a method
Ma questo è il caso semplice in cui IFoo ha una sola proprietà o metodo. In generale, si dovrebbe implementare tutti di membri del IFoo; tra cui leggere le proprietà / scrittura ed eventi che attualmente non è nemmeno possibile su oggetti anonimo tipizzati.