【问题标题】:Convert string to custom type using Convert使用 Convert 将字符串转换为自定义类型
【发布时间】:2011-12-21 15:43:17
【问题描述】:

我正在从 XML 文件中读取字符串值,我需要将其转换为某种(自定义)类型。

在我的例子中,我有一个 InputPatch 类,它指定所需的类型 [ValueType],所以我需要将字符串转换为 inputPatch.ValueType

我想做:

inputPatch.DefaultValue = Convert.ChangeType(
    defaultValueAttribute.Value, inputPatch.ValueType,
    CultureInfo.InvariantCulture);

但是对于我的BitmapFilename 类(它确实有一个字符串构造函数),结果是

从“System.String”到“ProjectX.Node.BitmapFilename”的无效转换。

那么,如何让 Convert 将字符串转换为我自己的 BitmapFilename 类?

【问题讨论】:

    标签: c# class types


    【解决方案1】:

    我不会为此使用Convert;相反,您可以使用:

    TypeConverter converter = TypeDescriptor.GetConverter(inputPatch.ValueType);
    object value = converter.ConvertFromInvariantString(defaultValueAttribute.Value);
    

    这确实需要您继承TypeConverter,并为您的类型标记转换器。但是,它适用于所有标准类型,并且是可扩展的。

    [TypeConverter(typeof(BitmapFilenameConverter))]
    public class BitmapFilename {...}
    
    class BitmapFilenameConverter : TypeConverter {
        public override object ConvertFrom(ITypeDescriptorContext context,
            CultureInfo culture, object value)
        {
            string s = value as string;
            if(s != null) {
                  /***** YOUR CODE HERE ******/
            } else {
                return base.ConvertFrom(context, culture, value);
            }
        }
    }
    

    当然,还要编写转换器代码!

    【讨论】:

      【解决方案2】:

      让你的班级实现IConvertible

      已编辑:要从其他类型转换,请尝试Extension Methods

      【讨论】:

      • 似乎 IConvertible 用于将值转换为某物。我不想将我的 BitmapFilename 类转换为某种东西,我想使用 System.Convert 将字符串转换为 BitmapFilename。或者我在 IConvertible 中遗漏了一些可以帮助我解决这个问题的东西?
      • 尝试扩展方法 - 正如我在上面的编辑中提到的那样。但是,从架构方面来看,这是否是一个好主意完全是另一个问题。
      • 抱歉,我不确定我应该如何使用扩展方法让 System.Convert 将字符串转换为我的自定义类型?能详细点吗?
      • 我的应用程序使用插件,因此在编译时不知道自定义类型。我无法控制可以转换为的类型,但我可以强加一个结构来完成这项工作 - 但首先我必须找到一个 :)
      • 我要解决的方法是在运行时使用System.Activator 类构造请求的类型,然后使用反射来填充字段和属性。我假设文件的格式不在您的控制范围内 - 如果不是,您可以使用 XmlSerializer (msdn.microsoft.com/en-us/library/…) 为您进行序列化。
      【解决方案3】:

      因为您实际上要支持任何自定义类型,所以您必须想出自己的解决方案:实现您的自定义转换逻辑。这可以使用反射轻松完成。

      问候, 阿尔塔克

      【讨论】:

      • 我有一个字符串。我有一个可以用字符串参数构造的类型。当然必须有一种方法可以在不实现自定义转换器的情况下实现通用字符串到任何类型的转换?
      • 应该有自定义逻辑!在扩展方法或任何其他方法中实现它,但您必须自己编写逻辑。 .Net 足够聪明,但无法理解某人在字符串中写了什么以及应该如何处理。
      猜你喜欢
      • 1970-01-01
      • 2013-11-27
      • 2019-11-22
      • 2017-06-22
      • 2020-03-17
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2015-05-15
      相关资源
      最近更新 更多