2009-03-14 4 views
2

Ich habe Code ähnlich, dies zu:Wie instanziiere ich einen Typ und seinen Wert aus einer Zeichenfolge?

class Foo {  
    Dictionary<Type, Object> _dict; 

    void Create(string myType, string myValue) 
    { 
    var instance = Type.Instanciate(myType) // How do I do this? 
    if (var.IsPrimitive) 
    { 
     var.GetType().Parse(myValue) // I know this is there...how to invoke? 
     Dictionary[instance.GetType()] = instance; 
    } 
    } 

    T GetValue<T>(T myType) { return (T)_dict[T]; } 
} 

// Populate with values 
foo.Create("System.Int32", "15"); 
foo.Create("System.String", "My String"); 
foo.Create("System.Boolean", "False"); 

// Access a value 
bool b = GetValue(b); 

Also meine Fragen sind:
a) Wie kann ich den Typ
b) Analysieren Sie den Typ Wert aus einem String instanziiert, wenn Parse unterstützt wird.

+0

Wurde nicht genau diese Frage gestern gestellt? Scheint wie ich Hausaufgaben. Ich werde nach dem Link suchen, wenn er nicht gelöscht wurde ... –

Antwort

9

Hinweis: Wenn der Typ nicht in mscorlib oder der gerade ausgeführten Assembly enthalten ist, müssen Sie den Assemblynamen (und Versionsinformationen, falls er stark benannt ist) einschließen.

Hier ist ein vollständiges Beispiel mit Ihrem ursprünglichen Code. Beachten Sie, dass GetValue keinen normalen Parameter benötigt, da Sie den Typparameter (T) bereits angegeben haben.

using System; 
using System.Collections.Generic; 

public class Foo {  
    Dictionary<Type, Object> _dict = new Dictionary<Type, Object>(); 

    public void Create(string myType, string myValue) 
    { 
     Type type = Type.GetType(myType); 
     object value = Convert.ChangeType(myValue, type); 
     _dict[type] = value; 
    } 

    public T GetValue<T>() { return (T)_dict[typeof(T)]; } 
} 


class Test 
{ 
    static void Main() 
    { 
     Foo foo = new Foo(); 

     // Populate with values 
     foo.Create("System.Int32", "15"); 
     foo.Create("System.String", "My String"); 
     foo.Create("System.Boolean", "False"); 

     Console.WriteLine(foo.GetValue<int>()); 
     Console.WriteLine(foo.GetValue<string>()); 
     Console.WriteLine(foo.GetValue<bool>()); 
    } 
} 
+0

Meine Damen und Herren, der Mann schläft nie! Fantastisch und prägnant zugleich! – Benoit

0

können Sie versuchen, Activator.CreateInstance

Es hat Unterschriften einen Typ zu erhalten und ohne Parameter oder mit einer Reihe von ojekte dass während

1
using System.Reflection; 

public void Create(string myType, string myValue) 
{ 
    Type type = Type.GetType(myType); 
    if (type.IsPrimitive) 
    { 
     MethodInfo Parse = type.GetMethod("Parse"); 
     Parse.Invoke(null, new object[] { myValue }); 
     ... 
    } 
} 
0

Eine weitere Sache, die Parameter sein: keeping Ein Verweis auf Ihre neue Instanz im Dictionary könnte eine unbeabsichtigte Konsequenz haben: Der Verweis des Dictionary auf das Objekt verhindert, dass es jemals erfasst wird. Wenn das das ist, was du vorhast, dann ist das in Ordnung, aber sei dir sicher, dass du durch all die Implikationen dieses ersten Dinges hindurchkommst.

+0

Guter Punkt! In meinem Fall spielt das keine Rolle, da es sich um Konfigurationselemente handelt, die niemals gesammelt werden. – Benoit

Verwandte Themen