代码之家  ›  专栏  ›  技术社区  ›  Timothy Khouri

如何在运行时转换类型?

  •  21
  • Timothy Khouri  · 技术社区  · 17 年前

    我的场景应该很简单…我要转换的类型 总是 “字符串”。我要转换成…可能有很多事情-ints,datetime,…字符串等

    这很容易:

    string valueToConvertFrom = "123";
    
    int blah = Convert.ToInt32(valueToConvertFrom);
    

    然而。。。我不知道(直到运行时)我需要转换的值是一个“int”(或其他任何值)。我尝试过:

    string valueToConvertFrom = "123";
    
    Type convertToType = typeof(int);
    
    object blah = Convert.ChangeType(valueToConvertFrom, convertToType);
    

    但这给了我以下错误:“对象必须实现IConvertable。”

    我不想做一个switch语句并根据类型名调用“convert.toblah”…有什么建议吗?

    3 回复  |  直到 13 年前
        1
  •  30
  •   Asher    17 年前

    最干净的方法就是使用A型转换器。 您可以通过调用 TypeDescriptor.GetConverter 然后使用类型转换器的实例进行转换。 所以像这样:

    string valueToConvertFrom = "123";
    
    Type convertToType = typeof(int);
    
    TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             
    
    object blah =tc.ConvertFromString(valueToConvertFrom);
    
        2
  •  5
  •   arul    17 年前

    String类实现了IConvertible,这段代码应该可以简单地工作。你瞄准的是.NET的哪个版本?

    object o = Convert.ChangeType( str, convertToType );
    

    此外,您提到的大多数类型都是实现解析方法,所以您最好的方法可能是这样的。

    Type convertToType = ...;
    MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
    object blah;
    if(mi != null)
    {
        blah = mi.Invoke(null, new object[]{valueToConvertFrom});
    }
    else
    {
        // the type doesn't implement the Parse method, handle it another way :/
    }
    
        3
  •  5
  •   Mark Jones    14 年前

    Timothy的问题,一般应用于.NET中的类型转换问题,是一个非常大的问题。虽然转换策略在具有已知类型的特定场景中有些简单,但不幸的是,在.NET的任何实现中都没有在运行时完成从一个任意类型到另一个任意类型的类型转换的通用策略,Redmond也没有这种策略。但是,Microsoft为类型转换的一般概念提供了一些很好的指导原则,包括:

    我必须在我的系统中处理相同的一般问题,作为一个解决方案,我已经将所有标准策略合并到一个方法中。这一问题的范围很广,相关的转换策略也各不相同,因此这一合并方法只能在一篇完整的技术文章中介绍。但是,我在这里提供了我的方法文档的副本,希望这将帮助您在开发类似的、通用的解决方案时,牢牢掌握需要解决的总体需求。以下是我的文档链接:

    我希望这能帮助你,

    作记号