C#反射枚举选项到常数值

时间:2010-05-18 11:48:05

标签: c# reflection

我的代码以非常直接的方式向Guid反映了enum(DictionaryType)选项

if (dictionaryType == DictionaryType.RegionType)
    return Consts.DictionaryTypeId.RegionType;

if (dictionaryType == DictionaryType.Nationality)
    return Consts.DictionaryTypeId.Nationality;

请建议我将Enum选项反映到静态只读guid值的最佳方法。

提前谢谢

稍后编辑: 我无法为枚举选项分配任何属性,'cos枚举在数据模型程序集中声明,枚举不应与实现相结合(Guids,Tables ...)

2 个答案:

答案 0 :(得分:1)

一些简单的选择:

  • 转换声明
  • 一个Dictionary<DictionaryType, Guid>(如果你真的想要, 可以通过反射来填充)

答案 1 :(得分:1)

除了Jon的答案之外,您还可以在单​​独的类中将Guids作为字段提供,其中字段与其对应的枚举值具有相同的名称。

这可用于填充字典以便以后快速查找:

using System;
using System.Collections.Generic;

namespace SO2856896
{
    enum DictionaryType
    {
        RegionType,
        Nationality
    }

    class Consts
    {
        public class DictionaryTypeId
        {
            public static Guid RegionType = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D");
            public static Guid Nationality = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309E");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<DictionaryType, Guid> table = new Dictionary<DictionaryType, Guid>();

            Type idType = typeof(Consts.DictionaryTypeId);
            foreach (DictionaryType dicType in Enum.GetValues(
                typeof(DictionaryType)))
            {
                System.Reflection.FieldInfo field = idType
                    .GetField(dicType.ToString(), 
                        System.Reflection.BindingFlags.Static
                        | System.Reflection.BindingFlags.Public);
                Guid guid = (Guid)field.GetValue(null);
                table[dicType] = guid;
            }

            foreach (DictionaryType dicType in Enum.GetValues(
                typeof(DictionaryType)))
            {
                Console.Out.WriteLine(dicType + ": " + table[dicType]);
            }
        }
    }
}

输出:

RegionType: 21ec2020-3aea-1069-a2dd-08002b30309d
Nationality: 21ec2020-3aea-1069-a2dd-08002b30309e

我不完全确定我会选择自己,但也许是Jon的回答,一个查找指南的字典和上面的反射来填充它。