var argVisitor = Visitor.CreateFromExpression(arg);
argVisitor.Visit(prefix + "\t");
}
}
}
复制代码
View Codedemo1:(demo1的出输出太长无法贴图,建议读者自己尝试)
public class TestMonths
{
public int Conver32(int a)
{
return Convert.ToInt32(a);
}
}
TestMonths testMonths = new TestMonths();
var gg = 99;
Expression<Func<UserInfo, int, int, double>> exception = (user, a, b) => user.Age + (a / b) * a - b + a - (b + b) + (a % b) + (a > b ? a : b) / user.Level * gg + testMonths.Conver32(user.Level);
LambdaVisitor visitor = new LambdaVisitor(exception);
visitor.Visit("解析二进制运算:");
Console.WriteLine("\t");
复制代码
demo2:
Expression<Func<UserInfo, UserInfoModel>> lambda = (user) => new UserInfoModel
{
Age = user.Age,
Level = EF.Functions.DataLength(user.Name) ?? 0,
Name = user.Name
};
LambdaVisitor visitor3 = new LambdaVisitor(lambda);
visitor3.Visit("解析查询表达式:");
复制代码
创建
只有了解了他的构造,我们才懂得如何创建,下面给出两个例子分别是最常用的属性访问器和条件判断表达式
//属性访问器
{
//需要构建的表达式
Expression<Func<UserInfo, int>> left = (user) => user.Age;
//1.创建访问对象表达式 =>(user)
var param = Expression.Parameter(typeof(UserInfo), "user");
//
//2.创建访问属性表达式 =>(user.Age)
// @expression 我们需要访问成员的归属对象
// @member 成员访问器
var member = Expression.MakeMemberAccess(param, typeof(UserInfo).GetMember("Age").FirstOrDefault()!);
//3.创建Lambda表达式
var lambda = Expression.Lambda(member, param);
//测试编译输出 18
Console.WriteLine(lambda.Compile().DynamicInvoke(new UserInfo { Age = 18 }));
}
//条件判断表达式
{
//需要构建的表达式
Expression<Func<UserInfo, bool>> left = (user) => user.Age > 9;
//1.创建访问对象表达式 =>(user)
var param = Expression.Parameter(typeof(UserInfo), "user");
//
//2.创建访问属性表达式 =>(user.Age)
// @expression 我们需要访问成员的归属对象
// @member 成员访问器
var member = Expression.MakeMemberAccess(param, typeof(UserInfo).GetMember("Age").FirstOrDefault()!);
//
//3.创建常量表达式 =>(9)
var constant = Expression.Constant(9);
//
//4.创建条件判断表达式 =>(>)
var greaterThan = Expression.GreaterThan(member, constant);
//5.创建Lambda表达式
var lambda = Expression.Lambda(greaterThan, param);
//测试编译输出 True
Console.WriteLine(lambda.Compile().DynamicInvoke(new UserInfo { Age = 18 }));