2011-11-04 177 views
2

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

在我的情况下,我有一个InputPatch类,它指定了想要的类型[ValueType],所以我需要将字符串转换为inputPatch.ValueType

我想做的事:

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

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

从 'System.String' 到“projectX创建无效的演员。 Node.BitmapFilename”。

那么,我该如何获得转换将字符串转换为我自己的BitmapFilename类?

回答

-1

让你的类实现IConvertible

EDITED:与其它类型的转换,尝试Extension Methods

+0

看来,IConvertible是用来将值转换为某物。 我不想要将我的BitmapFilename类转换为某种东西,我想将字符串转换为使用System.Convert的BitmapFilename。 或者我在IConvertible中丢失了一些可以帮助我的东西吗? – Pygmy

+0

尝试扩展方法 - 正如我在上面的编辑中所述。但是,从架构方面来看这是否是一个好主意,完全是另一个问题。 – Melllvar

+0

我的歉意,我不知道我明白我应该如何使用扩展方法让System.Convert将字符串转换为我的自定义类型? 您能否详细说明一下? – Pygmy

0

因为你要真正支持任何自定义类型,你要拿出自己的解决方案:实现您的自定义转换逻辑。这可以很容易地使用反射来完成。

问候, Artak

+0

我有一个字符串。我有一个可以用字符串参数构造的类型。当然,如果不实现自定义转换器,肯定有办法获得通用的字符串到任意类型的转换吗? – Pygmy

+0

应该有一个自定义的逻辑!在eidther Extension方法或其他任何方法中实现它,但是必须自己编写逻辑。 .Net足够聪明,但没有太多的东西来理解有人在字符串中写了什么,以及应该如何处理。 – Artak

7

我不会用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); 
     } 
    } 
} 

当然,写转换器代码!