Ну, его вид можно, но с другой стороны вы должны указать, какой именно тип:
public static T GetId<T>(this Enum value)
where T : struct, IComparable, IFormattable, IConvertible
{
return (T)Convert.ChangeType(value, typeof(T));
}
System.Enum
, поскольку является базовым классом для всех типов перечислений. Назовите это:
PersonName person = PersonName.Robert;
short personId = person.GetId<short>();
Так как вы можете бросить почти ничего long
, вы могли бы даже это:
public static long GetId(this Enum value)
{
return Convert.ToInt64(value);
}
и называют:
PersonName person = PersonName.Robert;
long personId = person.GetId();
Что в противном случае возможно это получить object
экземпляр возвращен, например, тот или иной:
public static object GetId(this Enum value)
{
return Convert.ChangeType(task, Enum.GetUnderlyingType(value.GetType()));
}
PersonName person = PersonName.Robert;
var personId = (short)person.GetId();
// but that sort of defeats the purpose isnt it?
Все это связано с каким-то боксом и распаковкой. Второй подход выглядит лучше (вы даже можете сделать его int
, стандартный тип), а затем первый.
Что вы спрашиваете? – SLaks
Это невозможно сделать. (Вы не можете создать метод, основанный на базовом типе 'enum'). – SLaks
Зачем вам нужен метод расширения? Кастинг для базового типа уже прост, как '(int) SomeEnum.SomeValue' –