Как создать выражение перечисления из его типа и имени одного из его полей? - PullRequest
0 голосов
/ 27 сентября 2019

Мне было трудно найти то, что я пытаюсь сделать, и этот пост был самым близким, который я мог найти. Этот пост не будет работать, так как я не знаю целочисленное значение перечисления, я знаю только его имя.Учитывая следующий код:

public enum Foo 
{
    Row = 0,
    Column = 20, // This is why the second post won't work, I only know the name "Column"
    None = 30
}

public static class ExpressionGetter
{
    public static Expression GetExpression(Type type, string name)
    {
        // Not sure what I should do here. I want an expression object for Foo.Row
    }
}

void Main()
{
   var expression = ExpressGetter.GetExpression(typeof(Foo), "Row");
}

Позже в моем приложении я создаю деревья выражений для генерации запросов LINQ и знаю тип enum и имя enum, и теперь я хочусоздайте Expression.Constant этого или, если есть другой способ сделать это, я хотел бы знать, как.

В конце я хочу получить выражение, которое выглядит так:

Foo.Row

Я пробовал:

Expression.Property(null, enumType, name)

Но это не работает.Результат:

ArgumentException: свойство 'Row' не определено для типа 'Foo' Имя параметра: propertyName

, что имеет смысл, поскольку это структура, а не объект.

Так что я не уверен, как построить выражение Foo.Row, учитывая тип перечисления Foo и имя в виде строки.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Значение enum является статическим полем типа enum.Если у вас есть только имя значения enum в виде строки, вторая версия - это то, что вы ищете.Но вы также можете сделать Enum.Parse () с первой версией.

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

//  Or any other string that's valid
var name = "Row";
MemberExpression.Field(null, typeof(Foo), name);
0 голосов
/ 27 сентября 2019

Более или менее так:

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);
 }

Вы обычно используете много отражений и разбора строк при создании деревьев выражений.По крайней мере, это то, что я нашел в моем опыте

...