BEARBEITEN
Beide Fragen beantworten meine nicht. Vielleicht ein besserer Weg, diese Frage anzugehen:
Wie verwenden Sie eine gegossene Variable als Typ?
ODER Wie verwenden Sie eine Zeichenfolge, die in einen Typ umgewandelt wird, um eine Typvariable zu deklarieren? sieheWie verwenden Sie eine gegossene Variable als Typ?
Beispiel:
Document document = ((document)modelObject);
Der Dokumenttyp wird hier verwendet, aber sagen, dass ich nicht wusste, meine modelObject war ein Dokument, wie würde ich es bekommen?
Hypothetische vorgestellt Lösung, wobei t Dokument
Type t = Type.GetType(type.Name);
t tVar = ((t)modelObject);
In meinem Beispiel oben, es funktioniert nicht, weil " 't' eine Variable ist, sondern wie ein Typ verwendet"
ORIGINAL
Ich habe eine Kontrollstruktur, die ich verwenden möchte, um verschiedene Typen zu behandeln, wie sie dynamisch erscheinen. Diese Typen werden mit type.Name erfasst und dann die Steuerungsstruktur basierend auf solchen eingegeben. Ich möchte, dass ich die Kontrollstruktur für Ordner behalten kann, so dass ich die Ordnerfunktionalität weiter bearbeiten kann (die Erweiterung von Ordnern erlauben, etc.), aber verallgemeinere jeden anderen Typ, so dass alle darin behandelt werden können eine einzelne Struktur, anstatt die Struktur immer wieder zu kopieren, aber mit der geringfügigen Änderung des Typs, der gehandhabt werden soll.
Also, meine Strukturen aussehen (grob) wie folgt aus:
Type type = modelObject.GetType();
if (type.Name == "Folder")
{
Folder folder = ((Folder)modelObject);
TreeNode NewNode = new TreeNode(folder.Object_string);
NewNode.Tag = folder;
CurrentRootNode.Nodes.Add(NewNode);
if (fRecursive)
{
ModelObject[] objects = { modelObject };
String[] attributes = { "contents" };
WorkspaceObject[] NewNodeContents = ((Folder)modelObject).Contents;
AddContentsToNode(NewNode, NewNodeContents, true);
}
else
{
TreeNode EmptyNode = new TreeNode("");
NewNode.Nodes.Add(EmptyNode);
}
}
if (type.Name == "STL")
{
STL stl = ((STL)modelObject);
TreeNode NewNode = new TreeNode(stl.Object_string);
NewNode.Tag = stl;
CurrentRootNode.Nodes.Add(NewNode);
}
if (type.Name == "Document")
{
Document document = ((Document)modelObject);
TreeNode NewNode = new TreeNode(document.Object_string);
NewNode.Tag = document;
CurrentRootNode.Nodes.Add(NewNode);
}
Beachten Sie, wie die STL und Dokumenttypen behandelt werden genau das gleiche mit dem leichten Variation der Veränderung, welche Art sie wie behandelt werden. Idealerweise würde es so aussehen:
if (type.Name == "Folder")
{ ... }
else
{
(Type)type.Name tn = (((Type)type.Name)modelObject);
TreeNode NewNode = new TreeNode(tn.Object_string);
NewNode.Tag = tn;
CurrentRootNode.Nodes.Add(NewNode);
}
jedoch, wie oben zu sehen ist, type.Name eine Zeichenfolge ist.
(Type) type.Name Text auf schweben - Cannot convert type 'string' to 'System.Type'
Die Frage ist also:
Gibt es eine „generische“ Art und Weise Zeichenfolge zu konvertieren zu Typ oder Typ zuweisen auf eine Zeichenfolge basiert?
Ich kann nicht scheinen, irgendeine allgemeine Weise zu finden, die Typdeklaration über die Tafel zu verarbeiten (etwas wie die Idealbeispiel wäre ideal!).
In keinem meiner Beispiele wird etwas instanziiert; Es heißt Cast und ist in Ihrem Beispiel weniger teuer als der String-Vergleich. Aber wenn Sie sie einheitlich bearbeiten wollen (empfohlen), siehe mein zweites Beispiel. –
Das zweite Beispiel erfordert immer noch das Hinzufügen der IExplorable-Schnittstelle zu jeder anderen Option von unzähligen – jtth
Ist das ein Problem? Um welche Art von Objekten geht es hier überhaupt? Sind diese Klassen, die du geschrieben hast? –