你能在运行时更改Type的Name属性的值吗?

时间:2014-06-27 10:11:32

标签: c# reflection

是否可以更改/覆盖类型的Name属性?

鉴于课程定义:

class Sample
{}

您可以更改typeof(Sample).Name返回的值吗?

我正在使用自定义序列化库,它在源代码中使用typeof(T).Name

writer.WriteStartElement(typeof(T).Name);
writer.WriteValue(item);
writer.WriteEndElement();

4 个答案:

答案 0 :(得分:3)

不,您无法在运行时更改.Name的{​​{1}}。但是,大多数序列化库允许您通过提供自定义" binder"来控制名称的处理。 (等),或者通过使用属性注释类型来指示要使用的首选名称(注意:大多数允许属性的库允许通过序列化库的运行时配置提供名称)。 / p>

一个重要的问题是:这里使用的序列化库是什么?

如果序列化库不支持此功能,并且无法更改,那么所有这一切的唯一替代方法(不能重命名Type)就是创建一个类型(手动或通过运行时Sample 看起来像原始类型,但使用不同的代码,类似地:创建在两种类型之间进行转换的代码。

答案 1 :(得分:1)

我不知道如何完成这项任务。 CLR与ref对象编组类似,但我怀疑它会让你重命名"你的班级或其财产(领域)就是这样。

您最好的选择是要么符合旧代码,要么(更好的代码)是替换或更改序列化例程,使其不那么严格。

答案 2 :(得分:0)

对于使用BCL中的XmlSerialization库的XML序列化,您可以使用以下属性覆盖要生成的xml元素名称:

[XmlElement("SomeOtherName")]
public class Sample{...}

答案 3 :(得分:0)

根据您的问题,您提到要在序列化期间控制名称

如果要在序列化期间更改名称,可以使用以下属性

[DataContract(Name = "NewName")] 
[XmlRoot("NewName")] 
class Sample
{
}