Domanda

Ho un sacco di nodi figlio MDI che sono tutti creati allo stesso modo e per ridurre il codice ridondante mi piacerebbe poter chiamare un metodo, passargli una stringa (nome del nodo figlio), farlo creare il nodo e aggiungerlo al genitore.

Posso fare tutto il resto tranne creare la classe da una stringa di un nome di classe, come posso farlo?

È stato utile?

Soluzione

Attualmente sto usando questo in una delle mie applicazioni per rinnovare una classe

public static IMobileAdapter CreateAdapter(Type AdapterType)
{
  return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}

Restituisce un'istanza di una classe che implementa IMobileAdapter, ma puoi usarla ugualmente facilmente con una stringa:

public static IMyClassInterface CreateClass(string MyClassType)
{
  return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}

Chiamalo usando un codice simile al seguente:

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");

Ovviamente, la classe che crea deve implementare l'interfaccia IMyClassInterface in questo caso, ma con un factory di classe, probabilmente avresti comunque tutte le tue classi che implementano la stessa interfaccia.

Modifica :

In riferimento al tuo commento, ai fini di questa discussione, pensa al termine "montaggio". come set di file all'interno del tuo progetto vb / cs. Presumo che tu stia facendo tutto questo all'interno di un singolo progetto [assembly] e non si stenda su più progetti.

Nel tuo caso, poiché le tue classi estenderanno l'oggetto Form, faresti qualcosa del genere.

Form myInst = CreateClass("MyExtendedForm");

o

Form myInst = CreateClass(Type.GetType("MyExtendedForm"));

A seconda che si ottenga il tipo all'interno del metodo CreateClass o al di fuori di esso. Dovresti eseguire il cast della tua istanza sul tipo corretto per accedere a qualsiasi membro personalizzato. Considera questo:

class MyCustomForm : Form
{
    public int myCustomField{ get; set; }
}

Ho un modulo personalizzato che estende Form aggiungendo la proprietà myCustomField. Voglio creare un'istanza utilizzando Activator.CreateInstance ():

public static Form CreateClass(string InstanceName)
{
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}

Quindi lo chiamo usando:

Form myInst = CreateClass("MyCustomForm");

Quindi ora ho il mio modulo personalizzato memorizzato in myInst. Tuttavia, per accedere alla proprietà personalizzata [myCustomField], dovrai trasmettere la tua istanza al modulo corretto:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;

Altri suggerimenti

Activator.CreateInstance(Type.GetType(typeName))

Se hai una stringa che è il nome della classe, allora dovresti essere in grado di ottenere un oggetto Type da essa, chiamando Type.GetType (stringa). Da quel tipo, dovresti essere in grado di usare la riflessione per generare un oggetto.

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