Лучший способ представить пол в библиотеке классов, используемой в многоязычных приложениях - PullRequest
3 голосов
/ 27 апреля 2010

Я создаю библиотеку классов с некоторыми обычно используемыми классами, такими как лица, адреса и т. Д. Эта библиотека будет использоваться в многоязычном приложении, и я ищу наиболее удобный способ представления пола людей.

В идеале я хотел бы иметь возможность кодировать так:

Person person = new Person { Gender = Genders.Male, 
                             FirstName = "Nice", 
                             LastName = "Dude" }

if (person.Gender == Genders.Male)
  Console.WriteLine("person is Male");

Console.WriteLine(person.Gender); //Should output: Male

Console.WriteLine(person.Gender.ToString("da-DK")); 
//Should output the name of the gender in the language provided

List<Gender> genders = Genders.GetAll();
foreach(Gender gender in genders)
{
  Console.WriteLine(gender.ToString());
  Console.WriteLine(gender.ToString("da-DK"));
}

Что бы вы сделали? Перечисление и специализированный гендерный класс? Но как насчет локализации?


Edit: Я хотел бы отметить, что этот вопрос, по крайней мере, так же о том, как кодировать некоторые классы, которые позволяют писать код, как указано выше, у меня нет класса Gender или перечисления пола, я пытаюсь выяснить, как написать код, который позволил бы вышеуказанный код. Как будет выглядеть класс Genders? Вы бы использовали перечисление для полов?

Привет
Джеспер Хауге

Ответы [ 4 ]

4 голосов
/ 27 апреля 2010

Вы можете решить проблемы локализации, используя строки ресурсов. Вы можете создать строку ресурса для каждого значения Гендера и перевести ее для каждой поддерживаемой вами культуры.

2 голосов
/ 27 апреля 2010

Я бы не использовал перечисление и, вероятно, решил бы создать класс Gender с внутренним конструктором, а также статический класс Genders, чтобы в качестве свойств содержать доступные опции. В основном это будет тот же подход, который используется в .NET, например, для System.Drawing.Color и связанного с ним класса Colors.

По моему мнению, легче иметь дело с глобализацией, если у вас есть класс вместо enum.

1 голос
/ 27 апреля 2010

Ваш бизнес и классы данных не должны заботиться о том факте, что вы делаете локализацию, поскольку локализация - это (должна быть) полностью операция на стороне дисплея . Используйте именно то, что у вас есть, так как оно читабельно и легко обслуживается.

Для локализации значений .NET уже имеет встроенный менеджер ресурсов, который автоматически выбирает соответствующее значение ресурса на основе значения CurrentUICulture. Для этого конкретного сценария вы можете использовать значение ToString() из вашего перечисления в качестве ключа в файле ресурсов. Это позволит вам создавать разные файлы для разных культур (в соответствии с соглашением и ожиданиями менеджера ресурсов), каждый из которых имеет различное значение для "Male" и "Female".

http://msdn.microsoft.com/en-us/magazine/cc163609.aspx

http://msdn.microsoft.com/en-us/library/aa309421%28VS.71%29.aspx

0 голосов
/ 27 апреля 2010

Другой вариант - создать метод расширения для вашего перечислимого типа.Например:

public static class GenderExtensions
{
    public static string ToLocalizedText(this Gender gender)
    {
         // Lookup Localized content based on state of 'gender'
         return "This person is male";
    }
}

И тогда вы можете просто написать

gender.ToLocalizedText()

вместо

gender.ToString()
...