当前位置: 首页 > 编程语言 > C#

反序列化后初始化私有只读字段分享

时间:2023-04-10 21:16:53 C#

反序列化后初始化私有只读字段我需要在反序列化后初始化私有只读字段。我有以下DataContract:[DataContract]publicclassItem{publicItem(){//在反序列化时不调用构造函数//因为使用了FormatterServices.GetUninitializedObject//所以在反序列化时构造函数不会初始化字段_privateReadonlyField=newobject();}//在反序列化时不会调用初始化(与构造函数相同的原因)privatereadonlyobject_privateReadonlyField=newobject();[DataMember]publicstringSomeSerializableProperty{get;放;}[OnDeserializing]publicvoidOnDeconeserializing(){//使用这一行代码甚至无法编译,因为只读字段只能在构造函数中初始化_privateReadonlyField=newobject();我只需要,因为反序列化后_privateReadonlyField不为空。对此有什么建议-可能吗?或者我需要删除“只读”键,这不是一个好的选择。任何声明为privatereadonly的字段都可以在同一行或声明它的构造函数中实例化。一旦完成,就无法更改。来自MSDN:readonly关键字是可以在字段上使用的修饰符。当字段声明包含只读修饰符时,对声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生。这意味着您必须删除readonly关键字才能使其工作。序列化能够读取只读字段的值,因为它使用反射,忽略可访问性规则。因此,以下内容作为连载过程的一部分可以被认为是合理的,尽管在几乎任何其他情况下我都会强烈反对:它对每个人都有用,需要了解更多有关C#的学习教程,希望您多加关注——私人只读Doodad_oldField;[OptionalField(VersionAdded=2)]privatereadonlyWidget_newField;[OnDeserialized]privatevoidOnDeserialized(StreamingContextcontext){if(_oldField!=null&&_newField==null){varfield=GetType().GetField("_newField",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.DeclaredOnly|System.Reflection.BindingFlags.NonPublic);field.SetValue(this,newWidget(_oldField));}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: