C# 解析表达式<;Func<;实体,bool>&燃气轮机;模仿?

C# 解析表达式<;Func<;实体,bool>&燃气轮机;模仿?,c#,parsing,expression,linq-expressions,C#,Parsing,Expression,Linq Expressions,我想将表达式解析为一个模型: public class Program { static void Main() { List<Entity> entities = new List<Entity> { new Entity{ Id = 1, FullName = "Mohammad Dayyan"}, new Entity{ Id = 2, FullName = "Zahra

我想将
表达式
解析为一个模型:

public class Program
{
    static void Main()
    {
        List<Entity> entities = new List<Entity>
        {
            new Entity{ Id = 1, FullName = "Mohammad Dayyan"},
            new Entity{ Id = 2, FullName = "Zahra Ahmadi"},
            new Entity{ Id = 3, FullName = "Milad Ahmadi"},
            new Entity{ Id = 4, FullName = "Ali Dayyan"},
            new Entity{ Id = 5, FullName = "Masoud Ahmadi"},
        };

        //PredicateBuilder is from LinqKit http://www.albahari.com/nutshell/linqkit.aspx
        Expression<Func<Entity, bool>> predicate2 = PredicateBuilder.False<Entity>();
        predicate2 = predicate2.Or(q => q.Id == 1);
        predicate2 = predicate2.Or(q => q.Id == 3);
        predicate2 = predicate2.Or(q => q.Id == 5);

        Expression<Func<Entity, bool>> predicate1 = PredicateBuilder.True<Entity>();
        predicate1 = predicate1.And(q => q.FullName.Contains("Milad"));

//Predicate3 == {((True AndAlso Invoke(q => q.FullName.Contains("Milad"), f)) AndAlso Invoke(f => (((False OrElse (f.Id == 1)) OrElse (f.Id == 3)) OrElse (f.Id == 5)), f))}
        Expression<Func<Entity, bool>> predicate3 = predicate1.And(predicate2);    

        ExpressionModel model = ParseExpression(predicate3);    

        Console.WriteLine(model);
        Console.ReadKey();
    }

    static ExpressionModel ParseExpression(Expression<Func<Entity, bool>> expression)
{

    BinaryExpression binaryExpression = expression.Body as BinaryExpression;
    if (binaryExpression == null) return null;
    Expression left = binaryExpression.Left;
    Expression right = binaryExpression.Right;
    ExpressionModel expressionModel = new ExpressionModel
    {
        NodeType = binaryExpression.NodeType,
        Left = ParseExpression(left),
        Right = ParseExpression(right)
    };
    return expressionModel;
}

static ExpressionModel ParseExpression(Expression expression)
{

    BinaryExpression binaryExpression = expression as BinaryExpression;
    if (binaryExpression == null) return null;
    Expression left = binaryExpression.Left;
    Expression right = binaryExpression.Right;
    ExpressionModel expressionModel = new ExpressionModel
    {
        NodeType = binaryExpression.NodeType,
        Left = ParseExpression(left),
        Right = ParseExpression(right)
    };
    return expressionModel;
}
}


[Serializable]
public class Entity
{
    public int Id { get; set; }
    public string FullName { get; set; }
}

[Serializable]
public class ExpressionModel
{
    public ExpressionModel Left { get; set; }
    public ExpressionModel Right { get; set; }
    public ExpressionType NodeType { get; set; }
}
公共类程序
{
静态void Main()
{
列表实体=新列表
{
新实体{Id=1,FullName=“Mohammad Dayyan”},
新实体{Id=2,FullName=“Zahra Ahmadi”},
新实体{Id=3,FullName=“Milad Ahmadi”},
新实体{Id=4,FullName=“Ali Dayyan”},
新实体{Id=5,FullName=“Masoud Ahmadi”},
};
//PredicateBuilder来自LinqKithttp://www.albahari.com/nutshell/linqkit.aspx
表达式predicate2=PredicateBuilder.False();
predicate2=predicate2.Or(q=>q.Id==1);
predicate2=predicate2.Or(q=>q.Id==3);
predicate2=predicate2.Or(q=>q.Id==5);
表达式predicate1=PredicateBuilder.True();
predicate1=predicate1.And(q=>q.FullName.Contains(“Milad”);
//谓词3=={((True和also Invoke(q=>q.FullName.Contains(“Milad”),f))和also Invoke(f=>((False-OrElse(f.Id==1))或(f.Id==3))或(f.Id==5)),f))}
表达式predicate3=predicate1.And(predicate2);
ExpressionModel=ParseExpression(谓词3);
控制台写入线(模型);
Console.ReadKey();
}
静态表达式模型解析表达式(表达式)
{
BinaryExpression=expression.Body作为BinaryExpression;
if(binaryExpression==null)返回null;
表达式left=binaryExpression.left;
Expression right=binaryExpression.right;
ExpressionModel ExpressionModel=新的ExpressionModel
{
NodeType=binaryExpression.NodeType,
左=解析表达式(左),
右=解析表达式(右)
};
返回表达式模型;
}
静态表达式模型解析表达式(表达式)
{
BinaryExpression BinaryExpression=作为BinaryExpression的表达式;
if(binaryExpression==null)返回null;
表达式left=binaryExpression.left;
Expression right=binaryExpression.right;
ExpressionModel ExpressionModel=新的ExpressionModel
{
NodeType=binaryExpression.NodeType,
左=解析表达式(左),
右=解析表达式(右)
};
返回表达式模型;
}
}
[可序列化]
公共类实体
{
公共int Id{get;set;}
公共字符串全名{get;set;}
}
[可序列化]
公共类表示模型
{
公共表达式模型左{get;set;}
公共表达式模型权限{get;set;}
公共表达式类型节点类型{get;set;}
}
但是当解析器到达
True
调用(q=>q.FullName.Contains(“Milad”),f)
ParseExpression
方法返回null

如何解决它呢?

因为这个
调用(q=>q.FullName.Contains(“Milad”),f)
是一个and 这个

返回null,因为它不是二进制表达式

此外,
True
是一种恒常的表达。您需要更复杂的代码来解析它并处理所有这些选项


尝试使用此选项:

谢谢您的回复,您知道解析表达式的任何源代码或库吗?@Mohammad是的,我使用了它:。据我所知,它将表达式转换为可序列化的EditableExpression。EditableExpression有方法
ToExpression()
,可以将其转换回表达式。我找不到可下载的程序集,源代码也无法在VS中打开2012@Mohammad是的,它有点旧,但我们不知怎么用过它。好的,我找到了这个:。这应该适用于VS2012。
BinaryExpression binaryExpression = expression as BinaryExpression;
if (binaryExpression == null) return null;