是否可以使用带表达式的枚举来反映枚举值?考虑这个假设的例程:
public enum Fruit
{
Apple,
Pear
}
public void Foo(Fruit fruit)
{
Foo<Fruit>(() => fruit);
}
public void Foo<T>(Expression<Func<T>> expression)
{
//... example: work with Fruit.Pear and reflect on it
}
Bar()
会向我提供有关枚举的信息,但我想使用实际值。
背景:我一直在添加一些辅助方法来返回类型的CustomAttribute信息,并想知道类似的例程是否可以用于枚举。
我完全清楚你可以使用枚举类型来获取CustomAttributes。
更新
我在MVC中使用类似的概念和辅助扩展:
public class HtmlHelper<TModel> : System.Web.Mvc.HtmlHelper<TModel>
{
public void BeginLabelFor<TProperty>(Expression<Func<TModel, TProperty>> expression)
{
string name = ExpressionHelper.GetExpressionText(expression);
}
}
在此示例中,name
将是模型的成员名称。我想用枚举做类似的事情,所以名字将是枚举'成员'。这甚至可能吗?
更新示例:
public enum Fruit
{
[Description("I am a pear")]
Pear
}
public void ARoutine(Fruit fruit)
{
GetEnumDescription(() => fruit); // returns "I am a pear"
}
public string GetEnumDescription<T>(/* what would this be in a form of expression? Expression<T>? */)
{
MemberInfo memberInfo;
// a routine to get the MemberInfo(?) 'Pear' from Fruit - is this even possible?
if (memberInfo != null)
{
return memberInfo.GetCustomAttribute<DescriptionAttribute>().Description;
}
return null; // not found or no description
}
答案 0 :(得分:5)
您不需要Expression
。您需要知道的是enum
每个值都有一个字段。这意味着您可以执行以下操作:
public string GetEnumDescription<T>(T enumValue) where T : struct
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T has to be an enum");
FieldInfo field = typeof(T).GetField(enumValue.ToString());
if (field != null)
{
var attribute = field.GetCustomAttribute<DescriptionAttribute>();
if (attribute != null)
return attribute.Description;
}
return null; // not found or no description
}