使用枚举作为/与表达式一起使用
本文关键字:表达式 一起 枚举 | 更新日期: 2023-09-27 18:28:58
是否可以使用带有表达式的枚举来反映枚举值?考虑一下假设的例程:
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
将是模型的成员名称。我想对枚举做类似的事情,所以name将是枚举的"member"。这可能吗?
更新示例:
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
}
您不需要Expression
s。您只需要知道enum
的每个值都有一个字段。这意味着你可以做一些类似的事情:
public static string GetEnumDescription<T>(T enumValue) where T : struct, 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
}