可以在运行时更改Type的Name属性的值吗?
本文关键字:Name 属性 Type 运行时 | 更新日期: 2023-09-27 18:10:42
是否可以更改/覆盖Type的Name属性?
给定类定义:
class Sample
{}
可以更改typeof(Sample).Name
返回的值吗?
我正在使用一个自定义序列化库,它实际上在源代码中使用typeof(T).Name
:
writer.WriteStartElement(typeof(T).Name);
writer.WriteValue(item);
writer.WriteEndElement();
不允许在运行时修改Type
的.Name
。然而,大多数序列化库允许你对名称的处理有一些控制,要么通过提供自定义的"绑定器"(等),要么通过用属性注释类型来指示要使用的首选名称(注意:大多数允许属性的库也允许通过序列化库的运行时配置提供名称)。
如果序列化库不支持这一点,并且无法更改,那么唯一的替代方法(除了重命名Sample
)就是创建一个类型(手工创建,或者在运行时通过TypeBuilder
创建),使看起来与原始类型相似,但使用不同的代码,类似地:创建在两种类型之间进行转换的代码。
我不知道如何完成这样的任务。CLR对ref对象的封送做了类似的事情,但我怀疑它是否允许你以这种方式"重命名"你的类或它的属性(字段)。
您最好的选择是遵循旧代码,或者(更好的)替换或更改序列化例程以使其不那么严格。
在您的问题中,您提到要在序列化期间控制名称
如果要在序列化过程中更改名称,可以使用以下属性
[DataContract(Name = "NewName")]
[XmlRoot("NewName")]
class Sample
{
}
对于使用BCL中的XmlSerialization
库的XML序列化,您可以使用以下属性覆盖要生成的XML元素名称:
[XmlElement("SomeOtherName")]
public class Sample{...}