2009-05-27 10 views
13

ho una domanda su come è possibile (se possibile :) utilizzare un riferimento di tipo restituito da Type.GetType() a, ad esempio, creare IList di quel tipo?utilizzando il tipo restituito da Type.GetType() in C#

ecco codice di esempio:

Type customer = Type.GetType("myapp.Customer"); 
IList<customer> customerList = new List<customer>(); // got an error here =[ 

ringraziare in anticipo!

+0

IList è un'interfaccia, quindi non si può nuova esso. È necessario un nuovo tipo che implementa IList come Elenco . –

risposta

21

Qualcosa di simile a questo:

Type listType = typeof(List<>).MakeGenericType(customer); 
IList customerList = (IList)Activator.CreateInstance(listType); 

Naturalmente non è possibile dichiarare come

IList<customer> 

perché non è definita in fase di compilazione. Ma List<T> implementa IList, quindi puoi usarlo.

+3

Sì, perché non è definito in fase di compilazione, non ha molto senso usare un Elenco generico <> - si potrebbe anche usare un contenitore non generico come ArrayList. – Grokys

+0

In realtà dovresti trasmettere il risultato di Activator.CreateInstance a IList, poiché restituisce un oggetto ... –

+1

@Thomas: grazie, risolto. @ Groky: dipende. Usando l'elenco generico si ottengono controlli del tipo di runtime quando si aggiungono elementi. Oppure devi assegnarlo a un campo che sai (in qualche contesto) che è dello stesso tipo. –

0

La soluzione al vostro problema è fornito da Stefan già.

La ragione per cui non è possibile eseguire IList<customer> è perché non è possibile combinare il tempo di compilazione ei tipi di runtime in questo modo. Un indizio quando cerco di ragionare su qualcosa di simile è: come può l'intellisense capire quali membri deve mostrare. Nel tuo esempio questo può essere risolto solo in fase di esecuzione.

La risposta data da Stefan, può essere utilizzato. Comunque penso che non aiuti nel tuo problema di base, perché non ti dà intellisenza. Quindi penso che tu non abbia alcun vantaggio nell'usare solo un elenco non generico.

+0

Come Stefan ha sottolineato nei commenti per la sua risposta ci sono ancora degli advandages, come la lista generica che impedisce al codice di aggiungere oggetti di tipi diversi alla lista. Però perdi l'intelligenza. –

2

recente ho affrontato questo problem..I rendo conto che è una vecchia questione, ma pensato che qualcuno potrebbe trovare utile la soluzione che ho trovato (usando net 4.0). Questa è la configurazione che ho avuto:

public interface ISomeInterface{ 
    String GetEntityType{ get; } 
} 

public abstract class BaseClass : ISomeInterface{ 
    public String GetEntityType { 
      get{ return this.GetType().ToString(); } 
    } 
} 

public class ChildA : BaseClass { } 

public class ChildB : BaseClass { } 

Quello che ho fatto è stato creare un metodo di fabbrica:

public static dynamic GetRealType { ISomeInterface param } { 
    return Activator.CreateInstance("dllname", param.GetEntityType); 
} 

Creare l'oggetto come un tipo dinamico è stato quello che ha risolto per me. Ho dedotto il tipo da avere un metodo:

public void DoSomething<T>(T param){ 

    IList<T> list = somecode... 
} 

questo mi ha permesso di fare una chiamata al metodo e lasciare .net dedurre il tipo

public void myMethod(ISomeInterface param) { 
    dynamic value = Factory.GetRealType (param); 
    DoSomething(value); 
} 

speranza non ho fatto tutto confuso e in realtà aiuta, anche, mi spiace per il muro di testo

Problemi correlati