Дерево выражений не оценивается должным образом при использовании ExpandoObject - PullRequest
0 голосов
/ 27 апреля 2020

Я пишу дерево выражений в C# для оценки совпадения и нахождения того, совпадает ли одно из свойств объекта с некоторой предопределенной константой, и выполняет действие в соответствии с результатом. Поскольку я не уверен, какой тип объекта будет входным для выражения, я использовал ExpandoObject и дерево кодированных выражений согласно этому.

Когда я запускаю код, я не мог получить результат согласно условию , Всегда приводил к ложному.

var dynEmp = System.Text.Json.JsonSerializer.Deserialize<ExpandoObject>("{\"Id\":1,\"Name\":\"Test Name\"}");

ParameterExpression dynpe = Expression.Parameter(typeof(object), "employee");
DynamicExpression dynme = Expression.Dynamic(CreateGetMemberBinder(typeof(object), "Id"), typeof(object), dynpe);

ConstantExpression dynconstant = Expression.Constant(1, typeof(object));

BinaryExpression dynbody = Expression.Equal(dynme, dynconstant);
var dynexpressionTree = Expression.Lambda<Func<dynamic, bool>>(dynbody, new[] { dynpe });
var dynfunc = dynexpressionTree.Compile();
var result = dynfunc(dynEmp);

Console.WriteLine(result);

Обновление 1: метод CreateGetMemberBinder указан ниже

    private static GetMemberBinder CreateGetMemberBinder(Type type, string memberName)
    {
        return (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(
            Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags.None,
            memberName,
            type,
            new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }
            );
    }

Пожалуйста, исправьте ошибку в этом коде.

Большое спасибо, Тирумалай М

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...