Не используйте какое-либо ключевое слово или аргумент в качестве ввода или скобки для вашей функции. Это очень простое решение:)
Это - то, с чем я закончил тем, что шел, я не видел значение в добавлении класса пользовательского атрибута для удержания клавиши ресурса и затем поиска в файлы ресурсов - почему не только используют имя типа перечислений + значение как ключ ресурса?
using System;
using System.Resources;
using System.Reflection;
public class MyClass
{
enum SomeEnum {Small,Large};
private ResourceManager _resources = new ResourceManager("MyClass.myResources",
System.Reflection.Assembly.GetExecutingAssembly());
public string EnumDescription(Enum enumerator)
{
string rk = String.Format("{0}.{1}",enumerator.GetType(),enumerator);
string localizedDescription = _resources.GetString(rk);
if (localizedDescription == null)
{
// A localized string was not found so you can either just return
// the enums value - most likely readable and a good fallback.
return enumerator.ToString();
// Or you can return the full resourceKey which will be helpful when
// editing the resource files(e.g. MyClass+SomeEnum.Small)
// return resourceKey;
}
else
return localizedDescription;
}
void SomeRoutine()
{
// Looks in resource file for a string matching the key
// "MyClass+SomeEnum.Large"
string s1 = EnumDescription(SomeEnum.Large);
}
}
У Вас не может быть нескольких Система. ComponentModel. DescriptionAttribute применялся (так, чтобы опция отсутствовала).
Так добавляют уровень абстракции, описание содержит имя ресурса, и затем используйте поддержку локализации в ресурсах. Очевидно пользователи перечисления должны будут назвать Ваш вспомогательный метод сделать это.
Посмотрите мой пример таблицы в этом вопросе:
Localisation/I18n данных базы данных в LINQ к SQL
таблица типа состояния отображается на Перечислимые величины. Реальная выгода здесь - то, что Вы можете иметь локализацию в своих отчетах и через Ваши приложения и указать внешние идентификаторы для интеграции с третьими сторонами, которые не хотят Ваши внутренние значения и т.д. Это отделяет перечислимое описание от, он - значение.
Одним путем я сделал это однажды, должен был добавить метод расширения в том же пространстве имен как перечисление, которое возвратило строку. В моем случае это было просто hardcoded, но не будет никакой проблемой, получая их от файла ресурсов.
public static string Describe(this SomeEnum e)
{
switch(e)
{
SomeEnum.A:
return "Some text from resourcefile";
SomeEnum.B:
return "Some other text from resourcefile";
...:
return ...;
}
}
, Возможно, не чрезвычайно гладкое или необычное решение, но это работает =)
существует легкое решение: используйте атрибут LocalizedDescription для передачи ключа ресурса.
[Serializable]
public class LocalizableDescriptionAttribute:DescriptionAttribute
{
public LocalizableDescriptionAttribute(string resourceKey)
:base(Resources.ResourceManager.GetString(resourceKey))
{ }
}