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等接缝不完整。