2017-09-01 31 views
3

app.configには、カスタム要素を含むカスタムセクションがあります。電子メールの要素について文字列から文字列の配列への値を解析する

<BOBConfigurationGroup> 
    <BOBConfigurationSection> 
     <emails test="[email protected], [email protected]"></emails> 
    </BOBConfigurationSection> 
</BOBConfigurationGroup> 

私は、カスタムタイプがあります。

public class EmailAddressConfigurationElement : ConfigurationElement, IEmailConfigurationElement 
{ 
    [ConfigurationProperty("test")] 
    public string[] Test 
    { 
     get { return base["test"].ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } 
     set { base["test"] = value.JoinStrings(); } 
    } 
} 

をしかし、私は自分のWebアプリケーションを実行すると、私はエラーを取得する:

プロパティ「テスト」の値を解析できません。エラーは、 'String []'型の 'test'プロパティの文字列への変換をサポートするコンバータが見つかりません。

getterに文字列を分割する方法はありますか?

私は配列を必要とするときに文字列値を取得して分割することができますが、場合によってはそれを忘れる可能性があります。


JoinStrings - あなたはstringstring[]間の変換にTypeConverterを追加することができ、私のカスタム拡張メソッド

public static string JoinStrings(this IEnumerable<string> strings, string separator = ", ") 
{ 
    return string.Join(separator, strings.Where(s => !string.IsNullOrEmpty(s))); 
} 

答えて

2

です:

[TypeConverter(typeof(StringArrayConverter))] 
[ConfigurationProperty("test")] 
public string[] Test 
{ 
    get { return (string[])base["test"]; } 
    set { base["test"] = value; } 
} 


public class StringArrayConverter: TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string[]); 
    } 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     return ((string)value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return destinationType == typeof(string); 
    } 
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     return value.JoinStrings(); 
    } 
} 
0

のようなアプローチで考えてみましょう:

[ConfigurationProperty("test")] 
    public string Test 
    { 
     get { return (string) base["test"]; } 
     set { base["test"] = value; } 
    } 

    public string[] TestSplit 
    { 
     get { return Test.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } 
    } 

ここで、TestSplitはコード内で使用するプロパティです。

+1

解決策の1つですが、私はdownvoterではありません) – demo

+0

これは、他の回答と同じように堅牢なソリューションではなく、実際にはちょうどハックだからです。 – DavidG