C#值类型、引用类型、泛型、集合的表达式树怎么创建(云服务器、云主机、高防IP、高防服务器、香港服务器、美国服务器,开发技术)

时间:2024-04-30 12:05:16 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    C%23%E5%80%BC%E7%B1%BB%E5%9E%8B%E3%80%81%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E3%80%81%E6%B3%9B%E5%9E%8B%E3%80%81%E9%9B%86%E5%90%88%E7%9A%84%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%A0%91%E6%80%8E%E4%B9%88%E5%88%9B%E5%BB%BA

C# 表达式树中,定义一个变量,使用ParameterExpression

创建变量结点的方法有两种,

两种方式都是生成ParameterExpression类型Parameter()Variable()都具有两个重载。他们创建一个 ParameterExpression节点,该节点可用于标识表达式树中的参数或变量。

对于使用定义:

Expression.Variable用于在块内声明局部变量。

Expression.Parameter用于声明输入值的参数。

先看第一种

从代码来看,没有区别。

再看看具有两个参数的重载

如你所见,两者只有一个 allowByRef 出现了区别,Paramter 允许 Ref, Variable 不允许。

笔者在官方文档和其他作者文章上,都没有找到具体区别是啥,去 stackoverflow 搜索和查看源代码后,确定他们的区别在于 Variable 不能使用 ref 类型。

从字面意思来看,声明一个变量,应该用Expression.Variable, 函数的传入参数应该使用Expression.Parameter

无论值类型还是引用类型,都是这样子定义。

访问变量或类型的属性,使用

访问变量/类型的属性或字段,使用

访问变量或类型的方法,使用

访问属性字段和方法

他们都返回一个 MemberExpression类型。

使用上,根据实例化/不实例化,有个小区别,上面说了变量或类型。

意思是,已经定义的值类型或实例化的引用类型,是变量;

类型,就是指引用类型,不需要实例化的静态类型或者静态属性字段/方法。

上面的解释不太严谨,下面示例会慢慢解释。

使用Expression.Property()Expression.PropertyOrField()调用属性。

Console 是一个静态类型,Console.Title 可以获取编译器程序的实际位置。

使用表达式树表达如下

因为调用的是静态类型的属性,所以第一个参数为空。

第二个参数是一个 PropertyInfo 类型。

C#代码如下

在表达式树,调用实例的属性

除了 Expression.Property() ,其他的方式请自行测试,这里不再赘述。

使用Expression.Call()可以调用一个静态类型的函数或者实例的函数。

以 Console 为例,调用 WriteLine() 方法

Expression.Call() 的重载方法比较多,常用的重载方法是

因为要调用静态类型的函数,所以第一个 instance 为空(instance英文意思是实例)。

第二个 method 是要调用的重载方法。

最后一个 arguments 是传入的参数。

写一个类

调用实例的 Printf() 方法

表达式表达如下

注意的是,Expression.Variable(typeof(Test), "test");仅定义了一个变量,还没有初始化/赋值。对于引用类型来说,需要实例化。

上面的方式,是通过外界实例化传入里面的,后面会说如何在表达式内实例化。

引用类型的实例化,使用 new ,然后选择调用合适的构造函数、设置属性的值。

那么,根据上面的步骤,我们分开讨论。

使用Expression.New()来调用一个类型的构造函数。

他有五个重载,有两种常用重载:

依然使用上面的 Test 类型

默认没有参数的构造函数,或者只有一个构造函数,像上面这样调用。

如果像指定一个构造函数,可以

这里就不详细说了。

实例化一个构造函数的同时,可以给属性赋值。

两种重载是一样的。

我们将 Test 类改成

然后

表示调用构造函数并初始化新对象的一个或多个成员。

如果实例化一个类,可以使用

如果要在实例化时给成员赋值

实例化一个类型,调用构造函数、给成员赋值,示例代码如下

将 Test 类,改成这样

Test 类已经是一个泛型类,表达式实例化示例

集合类型使用ListInitExpression表示。

创建集合类型,需要使用到

ElementInit 表示 IEnumerable集合的单个元素的初始值设定项。

ListInit 初始化一个集合。

C# 中,集合都实现了 IEnumerable,集合都具有 Add 扥方法或属性。

使用 C# 初始化一个集合并且添加元素,可以这样

而在表达式树里面,是通过 ElementInit 调用 Add 方法初始化/添加元素的。

示例

示例

本文:C#值类型、引用类型、泛型、集合的表达式树怎么创建的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:JavaScript ES6的函数怎么用下一篇:

20 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18