Перетворити змінну на тип, відомий лише під час виконання?


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

Як я можу valueробити кастинг paramType? valueце string, paramTypeймовірно , просто базовий тип , як int, stringабо , може бути float. Я круто з цим викидаю виняток, якщо перетворення неможливе.




4
Коментар @ MichaelFreidgeim - можливий копія попереднього.
kmote

1
@kmote, коментар “можливий дублікат” зазвичай генерується автоматично, коли хтось голосує, щоб закрити питання як дублікат. Не знаю, чому система вставила той самий коментар вдруге замість збільшення голосу за перший коментар. Можливо, найстаріший коментар був створений вручну, оскільки в ньому "мало можливо" є
маленький

@kmote, це відома проблема meta.stackoverflow.com/questions/367526/…
Michael Freidgeim

Відповіді:


88

Типи, якими ви користуєтесь, усі IConvertible. Як такий ви можете використовувати ChangeType.

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

12
чудово ... в один рядок. значення змінної = Convert.ChangeType (objectValue, objectType);
Rigin

17

Ви могли б рухатись динамічно; наприклад:

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; }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.