C# 使用TypeConverter将字符串转换为字符串数组
我需要将字符串C# 使用TypeConverter将字符串转换为字符串数组,c#,string,converter,C#,String,Converter,我需要将字符串“foo1,foo2,foo3”转换为string[] 我想使用TypeConverter或其子ArrayConverter。它的contain方法ConvertFromString 但如果调用此方法,我会捕获一个异常ArrayConverter无法从System.String转换。 我知道拆分,不要向我推荐此解决方案 ----解决方案--- 使用@Marc Gravel的建议和@Patrick Hofman对该主题的回答,我编写了CustumTypeDescriptorProvi
“foo1,foo2,foo3”
转换为string[]
我想使用TypeConverter
或其子ArrayConverter
。它的contain方法ConvertFromString
但如果调用此方法,我会捕获一个异常ArrayConverter无法从System.String转换。
我知道拆分,不要向我推荐此解决方案
----解决方案---
使用@Marc Gravel的建议和@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);
我相信这可以帮助某人,使他免于愤怒的沮丧者。很简单:你不能
new ArrayConverter().CanConvertFrom(typeof(string));
返回false
您最好的选择是您自己提到的选项:string.Split
,或者从ArrayConverter
派生并实现您自己的:
public class StringArrayConverter : ArrayConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string s = value as string;
if (!string.IsNullOrEmpty(s))
{
return ((string)value).Split(',');
}
return base.ConvertFrom(context, culture, value);
}
}
最后,我仍然使用
string.Split
。当然,您可以提出我们自己的实现。很简单:您不能
new ArrayConverter().CanConvertFrom(typeof(string));
返回false
您最好的选择是您自己提到的选项:string.Split
,或者从ArrayConverter
派生并实现您自己的:
public class StringArrayConverter : ArrayConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string s = value as string;
if (!string.IsNullOrEmpty(s))
{
return ((string)value).Split(',');
}
return base.ConvertFrom(context, culture, value);
}
}
最后,我仍然使用
string.Split
。当然,您可以提出我们自己的实现。您可以使用Regex.Matches
:
string[] result =
Regex.Matches("foo1,foo2,foo3", @",").Cast<Match>().Select(m => m.Value).ToArray();
string[]结果=
Regex.Matches(“foo1、foo2、foo3”、@“、”).Cast().Select(m=>m.Value.ToArray();
编辑:我没有正确理解正则表达式,但主要观点仍然成立 您可以使用
Regex.Matches
:
string[] result =
Regex.Matches("foo1,foo2,foo3", @",").Cast<Match>().Select(m => m.Value).ToArray();
string[]结果=
Regex.Matches(“foo1、foo2、foo3”、@“、”).Cast().Select(m=>m.Value.ToArray();
编辑:我没有正确理解正则表达式,但主要观点仍然成立 鉴于
string.Split
的目的正是为了满足OP的要求,我不确定类似方法的更奇特的变体是否会增加多少…@MarcGravel嗯,OP特别要求提供一种不使用string.Split
的解决方案,因此,我建议了一种不同的方法。鉴于string.Split
的目的正是为了满足OP的要求,我不确定类似方法的更奇特的变体是否会增加很多…@MarcGravel嗯,OP特别要求一种不使用string.Split
的解决方案,所以我建议了一种不同的方法。为什么不使用string.Split
(这正是您想要的)?为什么要使用TypeConverter
(默认情况下不支持此方案)。有一些注册自定义类型描述提供程序的方法,这些提供程序可以反过来提供自定义转换器,但实现起来很麻烦。。。这需要一个很好的理由:“我想要一些东西来喝汤,但不要建议我用勺子!”帕特里克霍夫曼-我错过了。使用Split
完全显而易见,这让我看不清问题的其余部分。为什么o‘为什么.Split(',')
不是一个合适的解决方案?@PatrickHofman-也许有人可以使用IL和System.Reflection.Emit发布一个解决方案。
@Dr_klo仅仅说“我想使用TypeConverter”是不够的,从那一点上说不出一个合理的答案。例如,在大多数情况下:要执行您想要的操作,您需要一个TypeDescriptionProvider
和一个自定义ICustomTypeDescriptor
,并连接到多个注册API。这不是小事。这是可以做到的,但是知道你想做什么,为什么,是很重要的。考虑到规模,如果没有上下文:最正确的答案可能是:“使用string.Split”。为什么不使用string.Split
(这正是您想要的)?为什么要使用TypeConverter
(默认情况下不支持此方案)。有一些注册自定义类型描述提供程序的方法,这些提供程序可以反过来提供自定义转换器,但实现起来很麻烦。。。这需要一个很好的理由:“我想要一些东西来喝汤,但不要建议我用勺子!”帕特里克霍夫曼-我错过了。使用Split
完全显而易见,这让我看不清问题的其余部分。为什么o‘为什么.Split(',')
不是一个合适的解决方案?@PatrickHofman-也许有人可以使用IL和System.Reflection.Emit发布一个解决方案。
@Dr_klo仅仅说“我想使用TypeConverter”是不够的,从那一点上说不出一个合理的答案。例如,在大多数情况下:要执行您想要的操作,您需要一个TypeDescriptionProvider
和一个自定义ICustomTypeDescriptor
,并连接到多个注册API。这不是小事。这是可以做到的,但是知道你想做什么,为什么,是很重要的。考虑到规模,如果没有上下文:最正确的答案可能是:“使用string.Split”。我不能在我的程序中直接使用Split
,但您关于派生类的解决方案是最好的,因为它并没有打破程序的OOP范例。我们想知道ArrayConverter的意义是什么,因为我们可以转换为字符串,但不能从字符串转换,这与其他基本的.Net类型转换器(例如NullableConverter)不同。像ArrayConverter这样的接缝是不完整的。我不能在我的程序中直接使用Split
,但您关于派生类的解决方案是最好的,因为它不会破坏程序的OOP范例。我想知道ArrayConverter的意义是什么,因为我们可以转换为字符串,但我们不能从字符串转换,这与其他基本的.Net类型转换器不同(例如NullableConverter)。ArrayConverter等接缝不完整。