2016-04-25 22 views
0

Gibt es eine Möglichkeit, einen Typ in der Laufzeit anzugeben, indem Sie eine Zeichenfolge mit dem Namen des Typs umwandeln? Ich hüpfe meinen unten stehenden Kompilierungscode und kann erklären, was ich versuche zu tun. Lassen Sie es mich wissen und versuchen Sie es besser zu erklären.Casting-String zum Typ

var valueFromDropDownMenu = "MyClass"; 

List<Type.GetType(valueFromDropDownMenu)> dynamicList = 
    new List<Type.GetType(valueFromDropDownMenu) >(); 

// Code to iterate through objects and populate dynamicList 
// with all objects of correct type 

Was ich versuche zu tun ist, den Benutzer wählen zu lassen, welche Art von Objekt ich verarbeiten werde.

Ich verwende Unity3D, das ist ein Game-Dev-Framework und es verwendet eine statische Methode, um Ressourcen aus Dateien zu laden. Diese Ressourcen müssen umgewandelt werden.

Ich versuche, ein Entwickler-Tool zu machen, mit dem der Entwickler einen bestimmten Typ von Ressourcen auswählen kann, die geladen werden sollen. Also muss ich etwas wie

tun
var files = LoadAll("Path, ofType(UserSelectedType)); 

Ist es möglich?

+6

Werfen Sie einen Blick [hier] (http://stackoverflow.com/questions/11107536/convert-string-to-type-in-c-sharp), sollte dies Ihre Frage beantworten. –

+1

Ich weiß, dass dies Ihre Frage nicht beantwortet, aber wäre es möglich für Sie eine Schnittstelle zu erstellen, die alle diese Typen implementieren könnten, d. H. Möchten Sie die gleiche Operation ausführen, egal welchen Typ sie tatsächlich bekommt? –

+0

'List ' wird nicht funktionieren - aber Sie brauchen das wahrscheinlich nicht. Ich nehme an, Sie haben bereits eine Liste von Elementen, aus denen Sie suchen können. Wenn ja, warum nicht den gleichen Typ verwenden - da alle gefundenen Objekte von diesem Typ sind oder überhaupt ein Untertyp? –

Antwort

1

Der springende Punkt von Generics ist, kompilierbares Schreiben zur Verfügung zu stellen. Der Versuch, Generika in der von Ihnen beschriebenen Weise zu verwenden, besiegt den Punkt.

Es wird nicht kompiliert, weil Sie versuchen, Laufzeittypisierung mit Compiletime-Typisierung zu mischen.

Selbst wenn dies funktioniert, würde es einfach unnötigen Overhead zur Verwendung eines einfachen List<object> hinzufügen, der dann zur Laufzeit für Typinformationen abgefragt werden kann. (Bitte beachten Sie, dass die Kompilierzeit für die Leistung natürlich immer vorzuziehen ist)

Der folgende Code gibt eine einzelne Zeile an der Konsole aus.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication9 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      List<object> x = new List<object>(); 
      x.Add(new MyTypeA()); 
      x.Add(new MyTypeB()); 
      foreach (var itemsOfA in x.Where(o => o.GetType().Name == "MyTypeA")) 
      { 
       Console.WriteLine("Found a " + itemsOfA.GetType()); 
      } 
     } 
    } 

    class MyTypeA { } 
    class MyTypeB { } 
} 
+0

Vielen Dank für Ihre Zeit. Ich denke dann ist mein Beispiel ein bisschen schlecht. Was ich versuche zu tun ist, den Benutzer wählen zu lassen, welche Art von Objekt ich verarbeiten werde. Ich verwende Unity3D, ein Game-Dev-Framework, und verwende eine statische Methode, um Ressourcen aus Dateien zu laden. Diese Ressourcen müssen umgewandelt werden. Ich versuche, ein Entwicklerwerkzeug zu machen, mit dem der Entwickler eine bestimmte Art von Ressourcen auswählen kann, die geladen werden sollen. – Lautaro

+0

(Fortsetzung ...) Also muss ich etwas tun wie var files = LoadAll ("Pfad, ofType (UserSelectedType)); Ist es möglich? – Lautaro

+1

@Lautaro: Sie können diese Informationen zu Ihrer Frage hinzufügen - speziell wie du diese Objekte bekommst und was du mit ihnen machen willst. –

Verwandte Themen