2010-10-24 7 views
60
foreach (var filter in filters) 
{ 
    var filterType = typeof(Filters); 
    var method = filterType.GetMethod(filter, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static); 
    if (method != null) 
    { 
     var parameters = method.GetParameters(); 
     Type paramType = parameters[0].ParameterType; 
     value = (string)method.Invoke(null, new[] { value }); 
    } 
} 

Wie kann ich value in paramType umwandeln? value ist ein string, paramType wird wahrscheinlich nur ein Basistyp wie int, string oder vielleicht float sein. Ich bin cool damit eine Ausnahme zu werfen wenn keine Konvertierung möglich ist.Variable in Typ konvertieren, der nur zur Laufzeit bekannt ist?

+1

möglich Duplikat [? Wie ein .Net Typeconverter für einen bestimmten Typen zum Nachschlagen und ruft] (http://stackoverflow.com/questions/956076/how-to-lookup-and-invoke -a-net-typeconverter-for-a-specific-type) –

+0

Mögliches Duplikat von [Wie sucht und ruft ein .NET TypeConverter für einen bestimmten Typ auf?] (http://stackoverflow.com/questions/956076/how- Nachschlage-und-Aufruf-ein-Netz-Typ Konverter für einen bestimmten Typ –

Antwort

62

Die Typen, die Sie verwenden, implementieren alle IConvertible. Als solche können Sie ChangeType verwenden.

value = Convert.ChangeType(method.Invoke(null, new[] { value }), paramType); 
+7

genial ... in einer Zeile. var Wert = Convert.ChangeType (objectValue, objectType); – Rigin

12

Sie könnten dynamisch gehen; zum Beispiel:

using System; 

namespace TypeCaster 
{ 
    class Program 
    { 
     internal static void Main(string[] args) 
     { 
      Parent p = new Parent() { name = "I am the parent", type = "TypeCaster.ChildA" }; 
      dynamic a = Convert.ChangeType(new ChildA(p.name), Type.GetType(p.type)); 
      Console.WriteLine(a.Name); 

      p.type = "TypeCaster.ChildB"; 
      dynamic b = Convert.ChangeType(new ChildB(p.name), Type.GetType(p.type)); 
      Console.WriteLine(b.Name); 
     } 
    } 

    internal class Parent 
    { 
     internal string type { get; set; } 
     internal string name { get; set; } 

     internal Parent() { } 
    } 

    internal class ChildA : Parent 
    { 
     internal ChildA(string name) 
     { 
      base.name = name + " in A"; 
     } 

     public string Name 
     { 
      get { return base.name; } 
     } 
    } 

    internal class ChildB : Parent 
    { 
     internal ChildB(string name) 
     { 
      base.name = name + " in B"; 
     } 

     public string Name 
     { 
      get { return base.name; } 
     } 
    } 
} 
Verwandte Themen