Я пишу дерево выражений в 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) }
);
}
Пожалуйста, исправьте ошибку в этом коде.
Большое спасибо, Тирумалай М