我有以下函数来检索枚举上给定类型属性的值:
public interface IAttribute<T>
{
T Value { get; }
}
public static class EnumExtensions
{
public static TAttributeValue GetAttribute<TAttribute, TAttributeValue>(this Enum enumValue) where TAttribute : IAttribute<TAttributeValue>
{
var enumType = enumValue.GetType();
var field = enumType.GetField(enumValue.ToString());
var attributes = field.GetCustomAttributes(typeof(TAttribute), false);
return attributes.Length == 0
? default(TAttributeValue)
: ((TAttribute)attributes[0]).Value;
}
}
像这样使用:
public class GenericStringAttribute : Attribute, IAttribute<string>
{
private readonly string value;
public GenericStringAttribute(string value)
{
this.value = value;
}
public string Value
{
get { return this.value; }
}
}
public enum Thing
{
[GenericString("thing's value")]
Thing = 0,
}
public static class ThingExtensions
{
public static string GetGenericStringValue(this Thing enumThing)
{
return enumThing.GetAttribute<GenericStringAttribute, string>();
}
}
但我不禁想知道是否有可能以某种方式删除GetAttribute<T, K>()
的第二个类型参数,因为该类型信息作为泛型参数存储到第一个类型参数T(或父类)第一种类型)。我发现很难尝试,因为我显然似乎需要两种类型定义,并且似乎不能约束“继承自IAttribute
”的“变量泛型类型”,同时仍然保持原始类型和IAttribute的泛型参数的类型。