【问题标题】:C#: Can an Enum Value be saved as a Setting?C#:枚举值可以保存为设置吗?
【发布时间】:2011-11-04 02:19:33
【问题描述】:

可以使用 C# 的 Properties.Settings.Default["MySetting"] 语法将 enum 值保存为设置吗?我试图在我的项目的属性页中创建一个设置,但只有系统类出现在可用类型列表中。

如果可以,我该怎么做?提前感谢您的帮助。

【问题讨论】:

    标签: c# enums settings


    【解决方案1】:

    只需将其存储为 int 并在需要时进行转换。

    Properties.Settings.Default["MySetting"] = myEnumValue;
    
    // and later 
    var settingValue = Properties.Settings.Default["MySetting"];
    MyEnum value = (MyEnum)settingValue;
    

    如果您觉得需要,您可以使用Enum.IsDefined(typeof(MyEnum), value) 来确保它是有效的。您还可以在配置文件中存储一个字符串值,以便它以人类可读的格式:

    Properties.Settings.Default["MySetting"] = myEnumValue.ToString();
    
    // and later 
    var settingValue = Properties.Settings.Default["MySetting"];
    MyEnum value = (MyEnum)Enum.Parse( typeof(MyEnum), settingValue );
    

    【讨论】:

    • 或者存储一个string,然后使用Enum.TryParse。这种方式更易于人类阅读。
    • 有更好的答案here。综上所述,在Type列中,选择“Browse...”,然后在底部的“Selected type”文本框中输入枚举的全名。
    【解决方案2】:

    这是一篇旧帖子,但我认为这个解决方案值得为可能遇到相同问题的人发布。
    基本上,它包括创建一个供主项目引用的新库,以便该库将枚举公开为可以从 Properties.Settings.settings 中选择的新类型。 就我而言,我想列举严重程度。

    新图书馆
    在您当前的解决方案下,使用以下代码创建一个新的空类库:

    namespace CustomTypes
    {
        [Serializable]
        public enum Severity
        {
            INFO,
            WARNING,
            EXCEPTION,
            CRITICAL,
            NONE
        }
    }
    

    参考图书馆

    • 在将要使用此类型的所有项目中编译并引用新创建的库。
    • 现在打开项目的属性 => 设置。
      type DropDown 列表中可能还看不到新库。如果你没有看到它, 选择下拉菜单底部的浏览并尝试查找库。
      如果它仍然不可见,请在 Selected Type 字段中输入新类型的完整路径。 (在本例中,输入“CustomTypes.Severity”,如下所示:



      从现在开始,新类型应该在 Properties.Settings.settings 中可见和可用。

    【讨论】:

      【解决方案3】:

      这是我将设置类型设置为MyEnum枚举类型的方法:

      1. 创建string 类型的新属性设置(在接下来的步骤中,string 类型将更改为MyEnum 类型)

      2. 打开 Settings.Designer.cs

      :

      1. 将新属性的返回类型从string修改为枚举类型MyEnum

        假设设置枚举类型被命名为MyEnum(在Company.Enums 命名空间),将返回类型编辑为global::Company.Enums.MyEnum类型:

            [global::System.Configuration.ApplicationScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.Configuration.DefaultSettingValueAttribute("MySetting")]
            public global::Company.Enums.MyEnum MyEnum{
                get {
                    return ((global::Company.Enums.MyEnum)(this["MyEnum"]));
                }
            }
        

      这样看起来更干净,只有一个语句;在客户端确保类型安全,无需对枚举进行不必要的字符串解析。

      MyEnum value = Properties.Settings.Default["MySetting"];
      

      【讨论】:

      • 这种方法的问题是,如果您对 .settings 进行任何更改,VS 会破坏您的更改。你不应该改变 *.Designer.cs 文件。
      • 你可以做的是创建另一个文件扩展设计器中定义的部分类,包含一个转换属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多