Есть ли способ сделать ToEnum универсальным - PullRequest
2 голосов
/ 25 марта 2010

Я хотел бы сделать это, но это не работает.

bool TryGetEnum<TEnum, TValue>(TValue value, out TEnum myEnum)
{

    value = default(TEnum);
    if (Enum.IsDefined(typeof(TEnum), value))
    {
        myEnum = (TEnum)value;
        return true;
    }
    return false;
}

Пример использования:

MyEnum mye;
bool success = this.TryGetEnum<MyEnum,char>('c',out mye);

Ответы [ 2 ]

4 голосов
/ 25 марта 2010

Попробуйте следующее

myEnum = (TEnum)((object)value);
2 голосов
/ 25 марта 2010

Лучшее, что вы сможете сделать, это:

bool TryGetEnum<TEnum>(Object value, out TEnum myEnum)
{
    myEnum = default(TEnum);
    if (Enum.IsDefined(typeof(TEnum), value))
    {
        myEnum = (TEnum)value;
        return true;
    }
    return false;
}

С вариантом использования, который выглядит примерно так:

MyEnum mye;
bool success = this.TryGetEnum<MyEnum>(2, out mye);

Вы не сможете сделать тип ввода универсальным, поскольку нет доступных общих ограничений для использования, которые позволили бы вам гарантировать, что TEnum использует TValue в качестве базового типа.

Кроме того (в качестве примечания) C # позволяет использовать только следующие типы в качестве базового значения для enum:

  • byte
  • sbyte
  • short
  • ushort
  • int
  • uint
  • long
  • ulong
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...