C # String Resource Values ​​в качестве значений Enum String Part? - PullRequest
5 голосов
/ 04 июня 2010

Используя VS2010 и .net V4.0, я хотел бы добиться следующего:

В моем проекте уже есть 2 файла ресурсов для двух языков - английского и чешского.

Я должен сказать, что управление ресурсами в .net превосходно, я удивлен даже завершением кода при реализации String, например:

string desc = Strings.ResourceManagerDesc

Получает строку, связанную с текущей культурой потока.

Теперь я пытаюсь создать Enum, который может интерпретировать строковую часть Enum из ресурсов Strings. Следующим способом (этот код НЕ РАБОТАЕТ):

public enum DownloadStatus
{
 1 = Strings.DownloadState_Complete,
 2 = Strings.DownloadState_Failed,
 3 = Strings.DownloadState_InProgress
}

Это выдуманный пример, но вы можете увидеть смысл здесь. Поскольку приведенный выше код не будет работать, есть ли лучший способ добиться того, чего я хочу?

Ответы [ 5 ]

9 голосов
/ 13 сентября 2011

Этот вопрос старый, но не имеет принятого ответа, и я искал хороший способ сделать это.

Вот что я сделал, я построил расширение для моего Enum, чтобы оно возвращало значение из диспетчера ресурсов:

public enum EventType
    {
        NewVersion = 1,
        Accepted = 2,
        Rejected = 3,
        BruteForce = 4
    }

    public static class EventTypeExtension
    {
        public static string Display(this EventType type)
        {
            return Strings.ResourceManager.GetString("EventType_" + type);
        }
    }

Надеюсь, это кому-нибудь поможет!

1 голос
/ 04 июня 2010

IMO, значение Enum должно быть отражено в домене и не должно относиться к пользовательскому интерфейсу (language-context).

Возможно, вы захотите сделать это

public enum DownloadStatus
{
    Complete = 1,
    Failed = 2,
    InProgress = 3
}

и использование некоторого метода EnumHelper для получения описания культуры для уровня пользовательского интерфейса

var downloadStatusString = EnumHelper.GetDescription<DownloadStatus>(DownloadStatus.Complete);

и класс EnumHelper будет читать специфическую для культуры строку из файла ресурсов

public static class EnumHelper
{
    public static string GetDescription<T>(T value)
        where T : struct
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("value must be Enum.", "value");
        }

        var name = value.ToString();

        string resourceKey = string.Format(CultureInfo.InvariantCulture, "{0}_{1}", typeof(T).FullName, name);

        object resource = HttpContext.GetGlobalResourceObject("EnumDescriptions", resourceKey, Thread.CurrentThread.CurrentUICulture);
        string description = resource as string ?? name;
        return description;
    }
}

Примечание: имя файла ресурса - EnumDescription , ключ должен быть этим преобразованием YourNamespace.EnumType_EnumValueInString. ( Я использую HttpContext для получения значения ресурса, и вы можете изменить его, если не используете ASP.Net. )

1 голос
/ 04 июня 2010

Перечисления не могут наследоваться от строк. В коде вам не нужно беспокоиться о языке кода, поэтому ваше перечисление может просто содержать соответствующие состояния.

Похоже, вам нужен служебный метод для преобразования значения перечисления в соответствующее строковое представление - просто создайте метод для этого.

РЕДАКТИРОВАТЬ: когда вы используете перечисление для включения дел, но нуждаетесь в дополнительной информации для каждого перечисленного значения, я склонен отбрасывать перечисление и создавать множество статических ссылок и использовать их вместо этого в проверке. Эта ссылка может быть классом, заключающим в себе значение перечисления, которое затем может предоставить полезные заголовки или описания.

1 голос
/ 04 июня 2010

Вы можете получить ресурс через строку, и поскольку вы можете преобразовать перечисление в строку, это довольно просто.

enum Whatever { Ready, Set, Go }

public static string GetEnumerationString(Enum enumeration)
{
    string resourceName = 
        string.Concat(enumeration.GetType().Name, "_", enumeration);
    return ResourceManager.GetString(resourceName);
}

Теперь в этой реализации мы присваиваем всем ресурсам перечисления имя перечисления. В проекте, который мы сделали, он просто предотвращает столкновения с другими ресурсами и позволяет легко их найти. Затем вам нужно будет убедиться, что вы добавили ресурсы, которые называются Whwhat_Ready, Whwhat_Set и Whwhat_Go.

Аналогично, если бы вы посмотрели на сгенерированный код для статического члена Strings, как вы изначально написали, вы, вероятно, увидите:

public static string DownloadStatus_Complete
{
    return ResourceManager.GetString("DownloadStatus_Complete", Resource.Culture);
}
1 голос
/ 04 июня 2010

Перечисления составляются как часть сборки. По сути, вы присваиваете метод значению enum, не являющемуся постоянным значением - CLR недостаточно умен, чтобы определить значение во время компиляции, он должен быть постоянным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...