使用Enum作为/表达式?

时间:2013-08-23 13:41:48

标签: c# linq-expressions

是否可以使用带表达式的枚举来反映枚举值?考虑这个假设的例程:

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
}

1 个答案:

答案 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
}