【发布时间】:2012-11-01 09:41:53
【问题描述】:
有没有办法在配置部分设置多个枚举值?
就像你在 .net 中所做的那样object.Filter = Filter.Update | Filter.Create;
<wacther filter="update, created"/>
支持类似的东西吗?
【问题讨论】:
标签: c# .net configuration configurationsection configurationelement
有没有办法在配置部分设置多个枚举值?
就像你在 .net 中所做的那样object.Filter = Filter.Update | Filter.Create;
<wacther filter="update, created"/>
支持类似的东西吗?
【问题讨论】:
标签: c# .net configuration configurationsection configurationelement
开箱即用:
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
【讨论】:
定义一个标志枚举:
[Flags]
enum Filter
{
None = 0,
Update = 1,
Create = 2
}
假设你的配置文件中有一个枚举字符串:
var enumString = "update, create";
这样就可以得到结果了:
var result = (Filter) Enum.Parse(typeof (Filter), enumString, true);
【讨论】:
最简单的方法是使用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"]);
【讨论】: