Опция C # Reflection Enum к постоянному значению - PullRequest
1 голос
/ 18 мая 2010

У меня есть код, который отражает опцию enum (DictionaryType) для Guid очень простым способом

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

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

Пожалуйста, предложите мне лучший способ отразить опцию Enum в статическом значении только для чтения.

Заранее спасибо

Отредактировано чуть позже: Я не могу присвоить никакие атрибуты параметрам перечисления, потому что перечисление объявлено в сборке модели данных, и перечисления не должны сочетаться с реализацией (Guids, Tables ...)

Ответы [ 2 ]

1 голос
/ 18 мая 2010

В дополнение к ответу Джона вы можете предоставить 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

Я не совсем уверен, что бы я выбрал сам, но, возможно, сочетание ответа Джона, словаря для поиска руководств и отражения, как указано выше, для его заполнения.

1 голос
/ 18 мая 2010

Пара простых опций:

  • оператор переключения
  • A Dictionary<DictionaryType, Guid> (который может быть заполнен отражением, если вы действительно хотите)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...