【发布时间】:2016-07-07 22:56:42
【问题描述】:
有很多示例可以通过自定义属性获取枚举,例如这里 Get Enum from Description attribute
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);
}
}
但这里的问题是你必须硬编码属性类型,即typeof(DescriptionAttribute)) as DescriptionAttribute
如何将此示例转换为通用扩展,这样我就不必对 CustomAttributeType 进行硬编码。
【问题讨论】:
-
作为一个想法,您可以在方法中添加另一个通用参数,但您应该知道输入参数的含义和用法才能使用它进行搜索。例如,现在你可以有这个条件
if(attribute.Description == description),但是当你传递一个泛型参数时呢? -
如果
attribute不是DescriptionAttribute,您将如何翻译:attribute.Description?
标签: c# generics enums custom-attributes