Konwertować zmienną na typ znany tylko w czasie wykonywania?


86
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 });
    }
}

Jak mogę rzucić valuesię paramType? valuejest string, paramTypebędzie prawdopodobnie być tylko podstawowy typ jak int, stringlub może float. Jestem fajny, że rzuca wyjątek, jeśli żadna konwersja nie jest możliwa.




4
Komentarz @ MichaelFreidgeim jest możliwym duplikatem poprzedniego.
kmote

1
@kmote, komentarz „możliwy duplikat” jest zwykle generowany automatycznie, gdy ktoś głosuje za zamknięciem pytania jako duplikatu. Nie jestem pewien, dlaczego system wstawił ten sam komentarz po raz drugi, zamiast głosowania zwiększającego pierwszy komentarz. Być może najstarszy komentarz został utworzony ręcznie, ponieważ ma małe litery p w
``

Odpowiedzi:


89

Wszystkie typy używanych narzędzi IConvertible. Jako takie możesz użyć ChangeType.

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

13
niesamowite ... w jednej linii. var value = Convert.ChangeType (objectValue, objectType);
Rigin

17

Możesz iść dynamicznie; na przykład:

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; }
        }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.