C# 将枚举用作/与表达式一起使用?

C# 将枚举用作/与表达式一起使用?,c#,linq-expressions,C#,Linq Expressions,是否可以使用带有表达式的枚举来反映枚举值?考虑这个假设的例程: 在本例中,name将是模型的成员名称。我想对枚举做一个类似的事情,所以名称应该是枚举的“成员”。这可能吗 更新示例: public enum Fruit { [Description("I am a pear")] Pear } public void ARoutine(Fruit fruit) { GetEnumDescription(() => fruit); // returns "I am a pear"

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

在本例中,
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
}
公共枚举结果
{
[描述(“我是一个梨”)]
梨
}
公共果酱(水果)
{
GetEnumDescription(()=>水果);//返回“我是一个梨”
}
公共字符串GetEnumDescription(/*这是什么形式的表达式?表达式?*/)
{
MemberInfo MemberInfo;
//从水果中获取成员信息(“梨”)的例行程序-这可能吗?
if(memberInfo!=null)
{
返回memberInfo.GetCustomAttribute().Description;
}
返回null;//找不到或没有说明
}

您不需要使用
表达式。您需要知道的是,
enum
s的每个值都有一个字段。这意味着您可以执行以下操作:

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
}
公共静态字符串GetEnumDescription(T enumValue),其中T:struct,Enum
{
FieldInfo field=typeof(T).GetField(enumValue.ToString());
如果(字段!=null)
{
var attribute=field.GetCustomAttribute();
if(属性!=null)
返回属性。说明;
}
返回null;//找不到或没有说明
}

你的意思是让Foo呼叫吧?为什么在这里使用表达式树?你到底想达到什么目的?您的问题目前非常模糊。@JonSkeet抱歉,在发布前更改的情况。我已经对它进行了更新,还添加了一个用于Mvc的例程示例,在该例程中,属性的名称被提取为标签。现在还不清楚为什么不调用
ToString()
,它将为您提供与值关联的名称。我对枚举名称不感兴趣,我想知道您是否可以使用相同的表达式技术来检索enum属性。描述如何使用反射获取枚举值的自定义属性。考虑到这种方法涉及到MemberInfo-是否不可能使用带有枚举的表达式来获取值的MemberInfo并以这种方式获取属性?您所说的“枚举属性”是什么意思?您说过“name将是enum‘member’”——假设您指的是“Pear”或“Apple”,这正是您从
到字符串
得到的结果。如果这不是您想要的,那么您确实需要给出一个完整的示例,说明您打算如何调用
Foo(Fruit)
,以及您希望得到的结果。在C#7.3中,您可以使用
where T:Enum
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
}
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
}