Два варианта, которые я могу придумать (может быть больше).
Первый вариант: сделать метод расширения универсальным. C # не допускает enum
в качестве общего ограничения, а это значит, что вам потребуется проверка во время выполнения, чтобы убедиться, что тип на самом деле enum
.
public static string EnumDescription<T>(this T value)
where T : struct, IComparable, IConvertible, IFormattable
{
if (!typeof(T).IsEnum)
throw new InvalidOperationException("Type argument T must be an enum.");
return EnumHelper<T>.EnumDescription(value);
}
Второй вариант: использовать отражение. Это будет медленно (er), хотя вы можете создать делегата из MethodInfo
и кэшировать его для повторного использования в Dictionary<Type, Delegate>
или аналогичном. Таким образом, вы будете нести затраты на рефлексию только при первом обнаружении этого типа.
public static string EnumDescription(this Enum value)
{
Type t = value.GetType();
Type g = typeof(EnumHelper<>).MakeGenericType(t);
MethodInfo mi = g.GetMethod("EnumDescription");
return (string)mi.Invoke(null, new object[] { value });
}