C# 如何根据枚举的类型和其中一个字段的名称创建枚举的表达式?

C# 如何根据枚举的类型和其中一个字段的名称创建枚举的表达式?,c#,enums,expression-trees,C#,Enums,Expression Trees,我很难找到我想要做的,而且是我能找到的最接近的。不会工作,因为我不知道枚举的整数值,我只知道它的名称。给定以下代码: 公共枚举Foo { 行=0, Column=20,//这就是为什么第二篇文章不起作用,我只知道“Column”这个名字 无=30 } 公共静态类ExpressionGetter { 公共静态表达式GetExpression(类型、字符串名称) { //不确定我应该在这里做什么。我想要一个Foo.Row的表达式对象 } } void Main() { var expression=

我很难找到我想要做的,而且是我能找到的最接近的。不会工作,因为我不知道枚举的整数值,我只知道它的名称。给定以下代码:

公共枚举Foo
{
行=0,
Column=20,//这就是为什么第二篇文章不起作用,我只知道“Column”这个名字
无=30
}
公共静态类ExpressionGetter
{
公共静态表达式GetExpression(类型、字符串名称)
{
//不确定我应该在这里做什么。我想要一个Foo.Row的表达式对象
}
}
void Main()
{
var expression=ExpressGetter.GetExpression(typeof(Foo),“Row”);
}
稍后在我的应用程序中,我将构建表达式树以生成LINQ查询,我知道
enum
的类型和
enum
的名称,现在我想创建一个
表达式。它的常量,或者如果有其他方法,我想知道如何创建

我希望在结尾有一个表达式,如下所示:

Foo.Row

我试过:

Expression.Property(null, enumType, name)
但它不起作用。导致

ArgumentException:未为类型“Foo”定义属性“Row” 参数名称:propertyName

这很有意义,因为它是一个结构而不是一个对象


因此,我不确定如何构建表达式
Foo.Row
,给定枚举类型
Foo
,并将名称作为字符串。

大致如下:

public enum EnumerationTest
{
    A, B, C
}

public class ClassTest
{
    public EnumerationTest Test { get; set; }
}

public static Expression PropertyExpression()
{
    // Think of this like a lambda (p) => p.Test == Enumeration.A
    var parameter = Expression.Parameter(typeof(ClassTest), "p"); 
    var property = Expression.PropertyOrField(parameter, "Test");
    var value = (EnumerationTest)Enum.Parse(typeof(EnumerationTest), "A");
    var constant = Expression.Constant(value, typeof(EnumerationTest));

    return Expression.Equal(property, constant);
 }

在执行表达式树时,通常会使用大量反射和字符串解析。至少在我的经历中,我发现或多或少是这样的:

public enum EnumerationTest
{
    A, B, C
}

public class ClassTest
{
    public EnumerationTest Test { get; set; }
}

public static Expression PropertyExpression()
{
    // Think of this like a lambda (p) => p.Test == Enumeration.A
    var parameter = Expression.Parameter(typeof(ClassTest), "p"); 
    var property = Expression.PropertyOrField(parameter, "Test");
    var value = (EnumerationTest)Enum.Parse(typeof(EnumerationTest), "A");
    var constant = Expression.Constant(value, typeof(EnumerationTest));

    return Expression.Equal(property, constant);
 }

在执行表达式树时,通常会使用大量反射和字符串解析。至少在我的经验中,我发现枚举值是枚举类型的静态字段。如果您只将枚举值的名称作为字符串,那么第二个版本就是您要查找的。但您也可以在第一个版本中执行Enum.Parse()

Expression.Constant(Foo.Row, typeof(Foo));

//  Or any other string that's valid
var name = "Row";
MemberExpression.Field(null, typeof(Foo), name);

枚举值是枚举类型的静态字段。如果您只将枚举值的名称作为字符串,那么第二个版本就是您要查找的。但您也可以在第一个版本中执行Enum.Parse()

Expression.Constant(Foo.Row, typeof(Foo));

//  Or any other string that's valid
var name = "Row";
MemberExpression.Field(null, typeof(Foo), name);

您正在尝试从枚举中提取字符串值吗?类似于,
Print(Foo.Row)
打印出
“Row”
?或者你想得到整数值,比如
0,20,30
?这个问题让人困惑,我感觉它有很多不相关的信息,而所需的信息却丢失了。您只是想从它的int中获取枚举值吗?这听起来像是一个。与其告诉我们你在做什么,不如告诉我们你的目标是什么,因为“从枚举的类型和名称创建枚举的表达式”不是目标。如果你对
表达式
参数使用
null
MyFoo
必须是静态属性,但是由于您使用的是
obj.MyFoo
它看起来不像是要测试静态属性…
Expression.Constant(Foo.Row,typeof(Foo))是否尝试从枚举中提取字符串值?类似于,
Print(Foo.Row)
打印出
“Row”
?或者你想得到整数值,比如
0,20,30
?这个问题让人困惑,我感觉它有很多不相关的信息,而所需的信息却丢失了。您只是想从它的int中获取枚举值吗?这听起来像是一个。与其告诉我们你在做什么,不如告诉我们你的目标是什么,因为“从枚举的类型和名称创建枚举的表达式”不是目标。如果你对
表达式
参数使用
null
MyFoo
必须是静态属性,但是由于您使用的是
obj.MyFoo
它看起来不像是要测试静态属性…
Expression.Constant(Foo.Row,typeof(Foo))我不知道运行时的枚举常量,否则,这将是一件微不足道的事情,请参阅我的编辑?还是属性或变量?不管是哪种方式,只需将Expression.Constant与Expression.propertyorfield交换。您组装第二个的方式与我组装第一个的方式相同。你有一些表达式,它有一些类型的属性。我很抱歉,我看到了我的问题最初引起的混乱,但已经更新了它<代码>变量常量=表达式.常量(EnumerationTest.A,typeof(EnumerationTest))是问题所在。我不知道常数是
EnumerationTest.A
。我知道
typeof(EnumerationTest)
,枚举值的名称(作为字符串)是
a
,但仅此而已。感谢您的帮助,但这或多或少是我在某一点上得到的,结果是表达式最终仅是值(即
,而不是
Foo.Row
)。Ed Plunkett提供了一个有效的答案。我不知道运行时的枚举常量,否则,这将是一件微不足道的事情,请参阅我的编辑。那么您正在处理两个属性?还是属性或变量?不管是哪种方式,只需将Expression.Constant与Expression.propertyorfield交换。您组装第二个的方式与我组装第一个的方式相同。你有一些表达式,它有一些类型的属性。我很抱歉,我看到了我的问题最初引起的混乱,但已经更新了它<代码>变量常量=表达式.常量(EnumerationTest.A,typeof(EnumerationTest))是问题所在。我不知道常数是
EnumerationTest.A
。我知道
typeof(EnumerationTest)
,枚举值的名称(作为字符串)是
a
,但仅此而已。感谢您的帮助,但这或多或少是我在某一点上得到的,结果是表达式最终仅是值(即
,而不是
Foo.Row
)。Ed Plunkett提供了一个answ