2013-03-16 5 views
19

Non so che la cosa che sto chiedendo sia disponibile o meno, ma voglio solo sapere se esiste e come funziona. Quindi, ecco la mia domanda:Crea istanza di oggetto di una classe che ha il suo nome nella variabile stringa

Ho 2-3 classe modello personalizzato di mio. Ad esempio, Cliente, Dipendente e Prodotto. Ora ho il nome della classe in una stringa. e basato su il nome della classe che arriva in una stringa, devo creare il suo oggetto e tornare a VISUALIZZA. Come potrei ottenere questo?

So un'opzione di IF ELSE affermazione, ma voglio provare un "dinamica" modo migliore, ...

+0

Quello che state cercando è la riflessione, ma come regola generale, se si utilizza la riflessione, si potrebbe fare qualcosa di sbagliato (ci sono casi in cui è necessario riflettere, ma non è comune). –

risposta

39

Avere il nome della classe nella stringa non è sufficiente per essere in grado di creare la sua istanza. In effetti avrete bisogno di uno spazio dei nomi completo che includa il nome della classe per creare un oggetto.

Supponendo di avere il seguente:

string className = "MyClass"; 
string namespaceName = "MyNamespace.MyInternalNamespace"; 

Di quello che è possibile creare un'istanza di quella classe, l'oggetto della classe MyNamespace.MyInternalNamespace.MyClass utilizzando uno dei seguenti tecniche:

var myObj = Activator.CreateInstance(namespaceName, className); 

o questo:

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className)); 

Spero che questo aiuti, per favore fatemi sapere se non.

+0

Ho il nome della classe in una stringa. quindi in pratica non ho scelto il tipo di classe. Allora come potrei creare oggetti di particolare classe. In "MyClass myObj =" Devo dare MyClass. bt ci può essere qualsiasi classe. – Dhwani

+0

Ho fatto esattamente quello che stai cercando di fare. Come ho già detto Oltre al nome della classe è necessario lo spazio dei nomi (come stringa). Avendoli entrambi, puoi creare l'istanza dell'oggetto di quella classe come ho mostrato. Modificherò la risposta per chiarire. Grazie per l'acquisto –

+4

Non dovrebbe leggere l'ultimo codice: "var myObj = Activator.CreateInstance (Type.GetType (namespaceName +". "+ ClassName));" (punto mancante?) – JCCyC

2

il modo più semplice è quello di utilizzare Activator. Passa il nome della classe a GetType e Crea nuova istanza.

ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));

public class ClassInstance 
{ 
    public string StringData { get; set; } 
} 

saluti, Nik

8
string frmName = "frmCustomer"; 
    //WorldCarUI. is the namespace of the form 
    Type CAType = Type.GetType("WorldCarUI." + frmName); 
    var myObj = Activator.CreateInstance(CAType); 
    Form nextForm2 = (Form)myObj; 
    nextForm2.Show(); 

che fa opere ..

saluti Avi