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
}