Yur*_*rik 4 .net c# serialization expression-trees
我需要使用表达式树生成代码,快速填充结构数组,T[]其中T包含只读字段.我需要在GetUninitializedObject()+ IL或基于反射的setter之后初始化它.
更新:目前看来是不可能的.请在MS Suggestions投票
struct Strct
{
public readonly int Value;
}
Run Code Online (Sandbox Code Playgroud)
此代码失败:
Expression.Assign(
Expression.Field(structByIndexFromArrayExp, "Value"),
deserializedValueExp)
Run Code Online (Sandbox Code Playgroud)
在表达式树构造期间,我得到了这个错误:Expression must be writeable
从常规代码角度来看,这完全有意义,但在反序列化期间却没有.
FormatterServices.GetUninitializedObject() 返回一个对象,我猜我需要避免它,因为它是盒装的,因此显着慢.
初始化此类结构数组的最快方法是什么?
更新:目前我看到的唯一现实的方法是动态生成struct T的克隆,但没有字段上的readonly属性,填写它们,将两个数组修复到内存中并进行内存复制.请投票告诉微软解决它.
仅仅因为你反序列化并不意味着你违反了语言的规则.如果我尝试这个,编译器会抱怨:
void Main()
{
var a = new Foo{Bar = 1};
}
public struct Foo
{
public readonly int Bar;
}
Run Code Online (Sandbox Code Playgroud)
不能指望表达式树执行您无法在代码中执行的操作.如果该属性不是真的readonly,请删除该readonly关键字.否则,您应该有一个允许您初始化它的构造函数.
public struct Foo
{
public Foo(int bar) {this.Bar = bar;}
public readonly int Bar;
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个调用该构造函数的表达式,而不是尝试直接设置该字段.