【问题标题】:ConfigurationSection multiple enum valuesConfigurationSection 多个枚举值
【发布时间】:2012-11-01 09:41:53
【问题描述】:

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

就像你在 .net 中所做的那样object.Filter = Filter.Update | Filter.Create;

<wacther filter="update, created"/>

支持类似的东西吗?

【问题讨论】:

    标签: c# .net configuration configurationsection configurationelement


    【解决方案1】:

    开箱即用:

    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

    【讨论】:

    • 无论谁使用它,请注意它会尽可能组合标志,所以如果上面的逻辑在 MyEnum 中定义了 Foz = 3,并且配置有标志,“Foo, Bar”,它会将其解析为 Foz。
    • 这不是解析的效果,而是数值的呈现方式。 “MyEnum.Foo | MyEnum.Bar”和“MyEnum.Foz”都将映射到相同的整数值“3”,但在渲染它时(例如,调用 ToString() 时)将选择最佳匹配。请参阅msdn.microsoft.com/en-us/library/16c1xs4z%28v=vs.110%29.aspx中的注释
    【解决方案2】:

    定义一个标志枚举:

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

    假设你的配置文件中有一个枚举字符串:

    var enumString = "update, create";
    

    这样就可以得到结果了:

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

    【讨论】:

    • 我发现这种方法存在几个问题。 a) 平台已经提供支持,无需复制功能 b) 解析值的问题与框架进行解析时文件中的位置相关联 c) 该方法要求您将平面字符串解析为单独的标记,所以它不是一个完整的解决方案,并且 Enum.Parse 已经处理了标志枚举的几个逗号分隔值,因此不需要拆分。
    • @fsimonazzi:感谢您的评论,选项 C 很有价值,我不确定我是否理解您的选项 A 和 B
    • 它们不是真正的选择,而是方法的问题。为什么要在平台已经为您完成某些事情时做某事,并且它做得更好,因为它不会强迫您处理字符串(您只声明枚举并且 System.Configuration 进行解析),并且在解析的情况下错误它将准确指示配置文件中的违规内容。我只是认为没有理由不让框架处理这个问题,实际上最初的问题是是否支持这种情况;答案是肯定的。
    • @fsimonazzi:好吧,想想看,这个枚举值可以放在某个地方,配置文件(例如 AppSettings),甚至其他文件。使用像您这样的部分似乎过于复杂。
    • 原贴已经有一个配置部分,想知道如何设置具有多个枚举值的属性。示例 XML 显示了一个带有自定义“过滤器”配置属性的自定义“观察者”配置元素。我包含的代码只是表明标志枚举的解析有效。当然,如果您想在配置文件中存储离散设置,作为一种解决方案将是矫枉过正,但这不是我们所要求的。
    【解决方案3】:

    最简单的方法是使用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"]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 2015-01-26
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      相关资源
      最近更新 更多