代码之家  ›  专栏  ›  技术社区  ›  mpen

是否将变量转换为仅在运行时已知的类型?

c#
  •  72
  • mpen  · 技术社区  · 14 年前
    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 ? 价值 是一个 string , 参数类型 可能只是一种基本类型 int 一串 ,或者 float

    2 回复  |  直到 8 年前
        1
  •  77
  •   Aliostad    14 年前

    您正在使用的类型 IConvertible . 因此你可以使用 ChangeType

     value = Convert.ChangeType(method.Invoke(null, new[] { value }), paramType);
    
        2
  •  14
  •   Jakob Flygare    12 年前

    您可以动态进行;例如:

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