Variable in Typ konvertieren, der nur zur Laufzeit bekannt ist?


83
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 werfen valuezu paramType? valueist eine string, paramTypewahrscheinlich nur ein Grundtyp wie sein wird int, stringoder vielleicht float. Ich finde es cool, eine Ausnahme auszulösen, wenn keine Konvertierung möglich ist.




4
@ MichaelFreidgeims Kommentar ist ein mögliches Duplikat des vorhergehenden.
kmote

1
@kmote, der Kommentar "Mögliches Duplikat" wird normalerweise automatisch generiert, wenn jemand abstimmt, um die Frage als Duplikat zu schließen. Ich bin mir nicht sicher, warum das System denselben Kommentar zum zweiten Mal eingefügt hat, anstatt die Stimmen des ersten Kommentars zu erhöhen. Möglicherweise wurde der älteste Kommentar manuell erstellt, da er in 'möglich'
Kleinbuchstaben

@kmote, es ist ein bekanntes Problem meta.stackoverflow.com/questions/367526/…
Michael Freidgeim

Antworten:


88

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

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

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

17

Sie könnten dynamisch werden; 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; }
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.