gpt4 book ai didi

c# - 如何使用 C# 中的表达式树用只读值初始化数组中的结构

转载 作者:太空狗 更新时间:2023-10-30 00:33:51 26 4
gpt4 key购买 nike

我需要使用表达式树生成代码,快速填充结构数组 T[],其中 T 包含一个只读字段。我需要像在 GetUninitializedObject() + IL 或基于反射的 setter 之后一样初始化它。

更新:目前这似乎是不可能的。请vote for it at MS Suggestions

struct Strct
{
public readonly int Value;
}

此代码失败:

Expression.Assign(
Expression.Field(structByIndexFromArrayExp, "Value"),
deserializedValueExp)

在构建表达式树的过程中,我得到这个错误:Expression must be writeable从常规代码的角度来看,这完全有意义,但在反序列化过程中则不然。

FormatterServices.GetUninitializedObject() 返回一个对象,我想我需要避免它,因为它是装箱的,因此速度要慢得多。

初始化此类结构数组的最快方法是什么?

更新:目前我看到的唯一现实的方法是动态生成 struct T 的克隆,但字段上没有只读属性,填写它们,在内存中修复两个数组并执行内存操作复制。 Please vote to tell Microsoft to fix it .

最佳答案

仅仅因为您正在反序列化并不意味着您可以打破语言规则。如果我尝试这个,编译器会提示:

void Main()
{
var a = new Foo{Bar = 1};
}

public struct Foo
{
public readonly int Bar;
}

不能期望表达式树执行您无法在代码中执行的操作。如果该属性实际上不应该是 readonly,请删除 readonly 关键字。否则,您应该有一个允许您初始化它的构造函数。

public struct Foo
{
public Foo(int bar) {this.Bar = bar;}
public readonly int Bar;
}

然后创建一个调用该构造函数的表达式,而不是尝试直接设置该字段。

关于c# - 如何使用 C# 中的表达式树用只读值初始化数组中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com