【发布时间】:2016-03-23 15:38:15
【问题描述】:
我需要将字符串"foo1,foo2,foo3" 转换为string[]。
我想使用TypeConverter 或其子ArrayConverter。它包含方法ConvertFromString。
但是如果我调用这个方法,我会捕获一个异常ArrayConverter cannot convert from System.String.
我知道Split,不要向我推荐这个解决方案。
----解决方案---
使用@Marc Gravell 的建议和@Patrick Hofman 对此主题的回答我写了CustumTypeDescriptorProvider
public class CustumTypeDescriptorProvider:TypeDescriptionProvider
{
public override ICustomTypeDescriptor GetTypeDescriptor(System.Type objectType, object instance)
{
if (objectType.Name == "String[]") return new StringArrayDescriptor();
return base.GetTypeDescriptor(objectType, instance);
}
}
public class StringArrayDescriptor : CustomTypeDescriptor
{
public override TypeConverter GetConverter()
{
return new StringArrayConverter();
}
}
StringArrayConverter 在此帖子下方的答案中实现。
为了使用它,我将CustumTypeDescriptorProvider 添加到提供者集合中
TypeDescriptor.AddProvider(new CustumTypeDescriptorProvider(), typeof(string[]));
要在TestClass 中使用它,您需要编写几行代码:
TypeConverter typeConverter = TypeDescriptor.GetConverter(prop.PropertyType);
cValue = typeConverter.ConvertFromString(Value);
我相信这可以帮助某人并使他免于愤怒的反对者。
【问题讨论】:
-
为什么你不想使用
string.Split(这正是你想要的)? 为什么你要使用TypeConverter(其中:默认不支持这种场景)。有注册自定义类型描述提供程序的方法,这些提供程序可以反过来提供自定义转换器,但是实现起来很复杂......这需要一个很好的理由 -
“我想要一些东西来吃汤,但不要给我勺子!”
-
@PatrickHofman - 我错过了。使用
Split的绝对明显性让我对问题的其余部分视而不见。为什么.Split(',')不是一个合适的解决方案? -
@PatrickHofman - 也许有人可以使用 IL 和
System.Reflection.Emit发布解决方案。 -
@Dr_klo 仅仅说“我想使用 TypeConverter”是不够的,从那时起就不可能给出一个明智的答案。例如,在大多数情况下:要做你想做的事,你需要一个
TypeDescriptionProvider和一个自定义的ICustomTypeDescriptor,并挂钩到几个注册 API。这不是微不足道的。可以做到,但知道自己想做什么以及为什么这样做,很重要。考虑到规模,如果没有上下文:真正可能的最正确答案是:“使用 string.Split”。