新建测试类
/// <summary>
/// 测试类
/// </summary>
public class MyClass
{
//public MyClass()
//{
// ClassName = "一般";
//}
public int Age { get; set; }
public string Name { get; set; }
public static string ClassName { get; set; } = "一般";
}
动态拼接Lambda表达式-表达式目录树动态构建=Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1
如下:
public static void TestExpression()
{
#region Expression simple
//Expression<Func<int, int>> expressionFunc = x => x + 1;
//var func = expressionFunc.Compile();
//var result = func(22);
//Console.WriteLine($"Expression<Func<int, int>>执行结果:{result}");
#endregion
#region Expression complex
//Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1;
//x => x.Age + 1 lambda表达式的具体构造过程,如下,
//lambda表达式 等号 左边的参数parameter
ParameterExpression paramLeft = Expression.Parameter(typeof(MyClass));
//lambda表达式 等号 右边的参数parameter x.Age + 1中的 x.Age
MemberExpression memberRight = Expression.PropertyOrField(paramLeft, "Age"); //MyClass的Age属性,可以再构造lambda表达式的时候传入,这样就可以根据需要来构造表达式了
//MemberExpression memberRight2 = Expression.Field(paramLeft, "Age");
//lambda表达式 等号 右边的参数parameter x.Age + 1中的 1 常量
ConstantExpression constantRight = Expression.Constant(1, typeof(int));
//lambda表达式 等号 右边的参数parameter x.Age + 1中的 + 加号
BinaryExpression binaryRight = Expression.Add(memberRight, constantRight);
//lambda表达式 等号 两边的参数parameter x => x.Age + 1;中的 => goto符号 x => x + 1;
Expression<Func<MyClass, int>> expressionFunc = Expression.Lambda<Func<MyClass, int>>(binaryRight, paramLeft);
//Expression<Func<int, int>> expressionFunc = x => x + 1;
var func = expressionFunc.Compile();
MyClass myClass = new() { Age = 11 };
var result = func(myClass);
//result = func.Invoke(myClass);
Console.WriteLine($"自定义构造lambda表达式树,产生Expression<Func<MyClass, int>>执行结果:{result}");
#endregion
}