表达式树练习实践:变量、常量与赋值
表达式树练习实践:变量、常量与赋值
定义变量
ParameterExpression
用来创建变量、变量参数表达式。
在 C# 中,变量分为以下几种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
一般上,只用到值类型和引用类型,这里不会说到指针类型。
C#的基本值类型有:bool、byte、char、double、float、int、long等(C#中,数组属于引用类型)。
表达式树创建一个有两种方式变量:
ParameterExpression varA = Expression.Variable(typeof(int), "x");
ParameterExpression varB = Expression.Parameter(typeof(int), "y");
区别:
Expression.Variable()
表示创建一个变量;
Expression.Parameter()
表示创建一个传入参数;
至于使用区别,后面会有很多具体示例可以体会到。
相同点:生成的类型都是 ParameterExpression
。
实例:
int a;
ParameterExpression varA = Expression.Variable(typeof(int), "x");
static void Main(string[] args)
{
// 等同 Test()里的 int b
ParameterExpression varB = Expression.Parameter(typeof(int), "y");
Console.ReadKey();
}
public static void Test(int b)
{
Console.WriteLine(b);
}
引用类型亦是使用相同方法创建变量。
关于引用类型的示例方法,后面会使用到。
定义常量
使用 Expression.Constan()
定义一个常量。
示例:
ConstantExpression constant = Expression.Constant(100);
ConstantExpression constant1 = Expression.Constant(100, typeof(int));
建议使用两个参数的重载方法,这样浏览代码是,能够快速理解,便于查找修改。
赋值
Expression.Assign()
用于给表达式树变量赋值。
常用定义如下
BinaryExpression Assign(Expression left, Expression right);
将右边表达式的值,赋予左边表达式。
为变量赋值:
ParameterExpression a = Expression.Variable(typeof(int), "x");
ConstantExpression constant = Expression.Constant(100, typeof(int));
BinaryExpression assign = Expression.Assign(a, constant);
注意重载方法类型
Console
的常用重载方法有
public static void WriteLine(object value);
public static void WriteLine(float value);
public static void WriteLine(string value);
在使用表达式树时,注意要调用的重载方法,不能被正常代码的隐式转换误导。
int a = 100;
Console.WriteLine(a);
ParameterExpression aa = Expression.Parameter(typeof(int), "a");
BinaryExpression aaa = Expression.Assign(aa, Expression.Constant(100, typeof(int)));
MethodCallExpression method = Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), aa);
// 如果没有学到过执行表达式树,现在可以先忽略这里
var call = Expression.Block(new ParameterExpression[] { aa }, aaa, method);
Expression<Action> lambda = Expression.Lambda<Action>(call);
lambda.Compile()();
前面输出 变量 a ,系统会进行隐式的类型转换。但是使用表达式树调用方法,要对应类型才行,以便找到正确的重载方法。上面的表达式树调用 Console.WriteLine()
会报如下错误:
System.ArgumentException:“Expression of type 'System.Int32' cannot be used for parameter of type 'System.String' of method 'Void WriteLine(System.String)'
Arg_ParamName_Name”
痴者工良(https://whuanle.cn)
分类:
c# 教程
, C# 表达式树与ORM
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理