Frage

Ich habe eine Reihe von untergeordneten MDI-Knoten, die alle in der gleichen Art und Weise erstellt werden und redundanten Code reduzieren ich eine Methode in der Lage sein möchten aufrufen, übergeben sie einen String (Name der untergeordneten Knoten), haben es schaffen der Knoten und fügen sie es dem Elternteil.

Ich kann all die Dinge tun, um die Klasse aus einer Zeichenfolge eines Klassennamen außer zu schaffen, wie kann ich das tun?

War es hilfreich?

Lösung

Ich verwende diese zur Zeit in einem meiner Anwendungen auf neue Klasse bis

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

Es ist eine Instanz einer Klasse, die Rückkehr IMobileAdapter implementiert, aber man kann es ebenso leicht mit einem String verwenden:

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

Nennen Sie es mit Code wie folgt:

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

Natürlich ist die Klasse erstellt es muss das Interface IMyClassInterface in diesem Fall implementieren, aber mit einer Klasse-Fabrik, dann würden Sie wahrscheinlich haben alle Klassen die gleiche Schnittstelle implementiert trotzdem.

Edit:

In Bezug auf Ihren Kommentar, für die Zwecke dieser Diskussion, denken Sie an dem Begriff „Montag“ als die Menge der Dateien in Ihrem vb / cs Projekt. Ich gehe davon aus, dass Sie tun dies alles innerhalb eines einzigen Projekts [assembly] und nicht über mehrere Projekte zu verbreiten.

In Ihrem Fall als Klassen das Form-Objekt werden erstreckt, würden Sie etwas tun.

Form myInst = CreateClass("MyExtendedForm");

oder

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

Je nachdem, ob Sie die Art innerhalb Ihrer CreateClass Methode oder außerhalb davon bekommen. Sie müssten Ihre Instanz auf die richtige Art, um alle benutzerdefinierten Mitglieder zugreifen werfen. Bedenken Sie:

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

Ich habe eine benutzerdefinierte Form bekommt das Formular Hinzufügen der myCustomField Eigenschaft erstreckt. Ich möchte dies mit Activator.CreateInstance instanziiert ():

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

ich es dann rufen Sie mit:

Form myInst = CreateClass("MyCustomForm");

So, jetzt habe ich mein benutzerdefiniertes Formular in myinst gespeichert. Um jedoch die benutzerdefinierte Eigenschaft zugreifen [myCustomField], müßten Sie Ihre Instanz auf die richtige Form zu werfen:

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

Andere Tipps

Activator.CreateInstance(Type.GetType(typeName))

Wenn Sie eine Zeichenfolge haben, die der Name der Klasse ist, dann sollten Sie in der Lage sein, daraus ein Type-Objekt zu erhalten, durch Type.GetType Aufruf (string). Von dieser Art sollten Sie in der Lage sein, Reflexion zu verwenden, um ein Objekt zu erzeugen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top