Использование атрибутов для сокращения отображения перечисления в перечисление и сопоставления перечисления / сопоставления с действием - PullRequest
6 голосов
/ 02 сентября 2008

Я думаю, что все видели код вроде:

public void Server2ClientEnumConvert( ServerEnum server)
{
    switch(server)
    {
       case ServerEnum.One:
           return ClientEnum.ABC
       //And so on.

Вместо этого зла мы могли бы сделать что-то вроде:

public enum ServerEnum
{
     [Enum2Enum(ClientEnum.ABC)]
     One,
}

Теперь мы можем использовать отражение, чтобы копировать ServerEnum и получать преобразования преобразования из самого объявления enum.

Проблема, с которой я столкнулся, заключается в объявлении атрибута Enum2Enum.

Это работает, но замена объекта o на Enum e - нет. Я не хочу иметь возможность передавать объекты конструктору, только другие перечисления.

public class EnumToEnumAttribute : Attribute
{
    public EnumToEnumAttribute(object o){}
}

Это не скомпилируется.

public class EnumToEnumAttribute : Attribute
{
    public EnumToEnumAttribute(Enum e){}
}

Есть ли причина ошибки компиляции? Как еще я мог бы передать информацию, необходимую для сопоставления, кроме:

EnumtoEnumAttribute(Type dest, string enumString)

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

Ответы [ 5 ]

4 голосов
/ 29 декабря 2008

Используя почти тот же пример, вы можете достичь этого непосредственно в enum:

public enum ServerEnum
{
   One = ClientEnum.ABC,
}

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

0 голосов
/ 02 сентября 2008

Почему бы не использовать словарь? Это может быть статическое свойство вашего класса, инициализированное теми причудливыми инициализаторами объекта schmancy, которые мы получили в 3.0? Вы не будете вводить больше кода (сопоставление должно быть выполнено даже при разрешении атрибута).

0 голосов
/ 02 сентября 2008

Вот правила для типов, которые могут быть включены в качестве параметров атрибута:

0 голосов
/ 02 сентября 2008

@ Danial Jennings Я прочитал там правила и обнаружил: «Тип enum, при условии, что он имеет общедоступную доступность, и типы, в которые он вложен (если есть), также имеют общедоступную доступность (раздел 17.2).».

Как попытка Enum e в конструкторе завершается неудачно на основании указанного правила? Это потому, что тип enum не гарантирует публичного отображения перечисленных значений? Это кажется правильным. Есть ли способ заставить это правило во время компиляции?

@ bdukes Вы совершенно правы. Я должен был подумать об этом больше.

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

0 голосов
/ 02 сентября 2008

Я бы, вероятно, использовал бы struct как тип, а затем выдал бы исключение, если это не тип Enum. Я не вижу, как ваша опция (Тип, строка) безопаснее, чем использование объекта или структуры.

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