Есть много примеров, в которых вы можете получить Enum от пользовательского атрибута, как здесь Get Enum from Description attributeПолучить Enum на пользовательский атрибут (Generic)
public static class EnumEx
{
public static T GetValueFromDescription<T>(string description)
{
var type = typeof(T);
if(!type.IsEnum) throw new InvalidOperationException();
foreach(var field in type.GetFields())
{
var attribute = Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) as DescriptionAttribute;
if(attribute != null)
{
if(attribute.Description == description)
return (T)field.GetValue(null);
}
else
{
if(field.Name == description)
return (T)field.GetValue(null);
}
}
throw new ArgumentException("Not found.", "description");
// or return default(T);
}
}
Но здесь проблема в том, что вы должны жестко закодировать AttributeType т.е. typeof(DescriptionAttribute)) as DescriptionAttribute
Как преобразовать этот пример в Generic extension так, чтобы мне не пришлось жестко закодировать CustomAttributeType.
Как идея, вы можете добавить еще один общий параметр для метода, но вы должны знать значение и использование входного параметра для возможности поиска с его помощью. Например, теперь вы можете получить этот критерий 'if (attribute.Description == description)', но как насчет того, когда вы передали общий параметр? –
Как бы вы перевели это тогда: 'attribute.Description', если' attribute' не является 'DescriptionAttribute'? – HimBromBeere