ConfigurationSection多个枚举值

时间:2012-11-01 09:41:53

标签: c# .net configuration configurationsection configurationelement

有没有办法在配置部分设置多个枚举值?

就像在.net object.Filter = Filter.Update | Filter.Create;

中一样
<wacther filter="update, created"/>

支持这样的东西吗?

3 个答案:

答案 0 :(得分:7)

它只是开箱即用:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var section = (MySection)ConfigurationManager.GetSection("mySection");
            Console.WriteLine(section.Enum);
        }
    }

    public class MySection : ConfigurationSection
    {
        [ConfigurationProperty("enum")]
        public MyEnum Enum
        {
            get { return (MyEnum)this["enum"]; }
            set { this["enum"] = value; }
        }
    }

    [Flags]
    public enum MyEnum
    {
        None = 0,
        Foo = 1,
        Bar = 2,
        Baz = 4
    }
}


<configSections>
  <section name="mySection" type="ConsoleApplication1.MySection, ConsoleApplication1"/>
</configSections>

<mySection enum="Foo, Bar"/>

打印:Foo,Bar

答案 1 :(得分:2)

定义标志枚举:

[Flags]
enum Filter
{
    None = 0,
    Update = 1,
    Create = 2
}

假设您的配置文件中包含一个枚举字符串:

var enumString = "update, create";

所以你可以得到结果:

var result = (Filter) Enum.Parse(typeof (Filter), enumString, true);

答案 2 :(得分:0)

最简单的方法是使用FlagsAttribute。但是,如果您已经拥有带有一组值的枚举,则可以使用以下代码:

public static IEnumerable<T> GetEnumValues<T>(string enumValues)
{
    return string.IsNullOrEmpty(enumValues)
        ? Enumerable.Empty<T>()
        : enumValues.Split(',').Select(e => System.Enum.Parse(typeof(T), e.Trim(), true)).Cast<T>();
}

[ConfigurationProperty("filter")]
public string Filter => GetEnumValues<FilterEnum>((string) this["filter"]);