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
È stato utile?

Soluzione

No, questo non è possibile.

tipo

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

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