public static void Show()
{
{
//-----------------------------表达式目录树和委托的比较--------------------------
Func<int, int, int> func = (m, n) => m * n + 2; //匿名方法
Expression<Func<int, int, int>> exp = (m, n) => m * n + 2;
//声明一个表达式目录树
//快捷方式的声明 数据结构;
//类似于一个树形结构,描述不同变量和常量之间的关系 数据结构;
//表达式目录树:语法树,或者说是一种数据结构
int iResult1 = func.Invoke(12, 23);
//exp.Compile()=> 委托;
int iResult2 = exp.Compile().Invoke(12, 23); //12 * 23 +2 278
//int iResult = func.Invoke(12, 13);
//Expression<Func<int, int, int>> exp1 = (m, n) =>
// {
// return m * n + 2;
// }; 不能有语句体,不能当做一个方法,不能有大括号,只能有一行代码
}
{
//----------------------手动拼装表达式目录树,不是用的lambda的快捷方式--------------
{
//Expression<Func<int>> expression = () => 123 + 234;
ConstantExpression left = Expression.Constant(123, typeof(int));
ConstantExpression right = Expression.Constant(234, typeof(int));
var plus = Expression.Add(left, right);
Expression<Func<int>> expression = Expression.Lambda<Func<int>>(plus, new ParameterExpression[0]);
int iResult = expression.Compile().Invoke();
int iResult1 = expression.Compile()();
}
{
// 更复杂一点的:
//Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 2;
ParameterExpression m = Expression.Parameter(typeof(int), "m");
ParameterExpression n = Expression.Parameter(typeof(int), "n");
ConstantExpression constant2 = Expression.Constant(2, typeof(int));
var multiply = Expression.Multiply(m, n);
var plus1 = Expression.Add(multiply, m);
var plus2 = Expression.Add(plus1, n);
var plus = Expression.Add(plus2, constant2);
Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus, new ParameterExpression[]
{
m,
n
});
int iResult = expression.Compile().Invoke(12, 10);
}
{
//Expression<Func<People, bool>> lambda = (x) => x.Id.ToString().Equals("5");
ParameterExpression x = Expression.Parameter(typeof(People), "x");
FieldInfo field = typeof(People).GetField("Id");
ConstantExpression constant5 = Expression.Constant("5");
var fieldExp = Expression.Field(x, field);
MethodInfo toString = typeof(int).GetMethod("ToString", new Type[] { });
MethodInfo equals = typeof(string).GetMethod("Equals", new Type[] { typeof(string) });
var tostringExp = Expression.Call(fieldExp, toString, new Expression[0]);
var equalsExp = Expression.Call(tostringExp, equals, new Expression[]
{
constant5
});
Expression<Func<People, bool>> expression = Expression.Lambda<Func<People, bool>>(equalsExp, new ParameterExpression[]
{
x
});
bool bResult = expression.Compile().Invoke(new People()
{
Id = 5,
Name = "德玛西亚"
});
}
}
{
//动态拼装Linq To Sql
{
var DbSet = new List<People>().AsQueryable();
//Expression<Func<People, bool>> exp = a => a.Name.Contains("name") && a.NAccount.Contains("Admin");
Expression<Func<People, bool>> exp = null;
Console.WriteLine("用户输入个名称,为空就跳过");
string name = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(name))
{
exp = a => a.Name.Contains(name);
DbSet = DbSet.Where(a => a.Name.Contains(name));
}
Console.WriteLine("用户输入个账号,为空就跳过");
string account = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(account))
{
exp = a => a.Account.Contains(account);
DbSet = DbSet.Where(a => a.Account.Contains(account));// 出现整个DBSet 暴露出来了,在使用的时候是非常危险
}
exp = a => a.Account.Contains(account) && a.Name.Contains(name);
}
}
}
(精华)2020年8月11日 C#基础知识点 表达式目录树的使用
猜你喜欢
转载自blog.csdn.net/aa2528877987/article/details/107938717
今日推荐
周排行