使用 Linq 表达式设置 readoly/InitOnly 成员字段
Set a readoly/InitOnly member field using Linq Expressions
给定一个 FieldInfo
,可以设置一个 C# readonly
/ CLR InitOnly 成员字段。
我什么时候以及为什么要这样做?
对于序列化程序,我创建了一个对象类型的空实例,然后填充数据流中的所有字段。
实际问题:
是否也有使用 Linq 表达式实现此目的的方法?
如果传递指向 readonly/initonly 字段的表达式,Expression.Assign
会导致异常。
或者我是否必须求助于 IL emit 来执行此操作(比 FieldInfo 更快)
不,Expression.Assign
检查字段的可赋值性,即使您可以破解它来创建赋值表达式,它也无法验证,也不可能 运行。发出 IL 是最快的方法,它还允许分配指针(LINQ 表达式不支持)。您可以查看 here 如何发出类似的方法。
给定一个 FieldInfo
,可以设置一个 C# readonly
/ CLR InitOnly 成员字段。
我什么时候以及为什么要这样做? 对于序列化程序,我创建了一个对象类型的空实例,然后填充数据流中的所有字段。
实际问题:
是否也有使用 Linq 表达式实现此目的的方法?
如果传递指向 readonly/initonly 字段的表达式,Expression.Assign
会导致异常。
或者我是否必须求助于 IL emit 来执行此操作(比 FieldInfo 更快)
不,Expression.Assign
检查字段的可赋值性,即使您可以破解它来创建赋值表达式,它也无法验证,也不可能 运行。发出 IL 是最快的方法,它还允许分配指针(LINQ 表达式不支持)。您可以查看 here 如何发出类似的方法。