C#: 枚举值可以保存为设置吗?

11

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

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

3个回答

17

将其作为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 );

7
或者存储一个字符串,然后使用Enum.TryParse。这样更易读懂。 - Ben Voigt
1
这里有一个更好的答案(https://dev59.com/dnI95IYBdhLWcg3wtwb4)。简而言之,在“类型”列中,选择“浏览...”,然后在底部的“所选类型”文本框中输入枚举的完整名称。 - Tsahi Asher

1
这是一篇旧文章,但我认为这个解决方案值得发布给可能遇到同样问题的人。基本上,它包括创建一个新库,以便可以从 Properties.Settings.settings 中选择该库公开的枚举作为新类型。
在我的情况下,我想枚举严重级别。 新库
在当前解决方案下,使用以下代码创建一个新的空类库:
namespace CustomTypes
{
    [Serializable]
    public enum Severity
    {
        INFO,
        WARNING,
        EXCEPTION,
        CRITICAL,
        NONE
    }
}

引用库

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

    enter image description here

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

    enter image description here


0

以下是我如何将Setting类型设置为枚举类型MyEnum的方法:

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

  2. 打开Settings.Designer.cs文件

:enter image description here

  • 将新属性的返回类型从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"];
    

    3
    这种方法的问题在于,如果你对.settings文件做出任何更改,VS会覆盖你所做的更改。你永远不应该修改*.Designer.cs文件。 - Tim Sparkles
    4
    您可以创建另一个文件扩展设计器中定义的部分类,其中包含一个转换属性,以此来完成您的需求。 - Tim Sparkles

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接