C# 能否在运行时更改类型的Name属性的值?
是否可以更改/重写类型的Name属性 给定类定义:C# 能否在运行时更改类型的Name属性的值?,c#,reflection,C#,Reflection,是否可以更改/重写类型的Name属性 给定类定义: class Sample {} 您能否更改typeof(Sample).Name返回的值 我正在使用一个自定义序列化库,它在源代码中使用typeof(T).Name: writer.WriteStartElement(typeof(T).Name); writer.WriteValue(item); writer.WriteEndElement(); 我不知道怎样才能完成这样的任务。CLR对由ref封送的对象做了类似的事情,但我怀疑它是否允
class Sample
{}
您能否更改typeof(Sample).Name
返回的值
我正在使用一个自定义序列化库,它在源代码中使用typeof(T).Name
:
writer.WriteStartElement(typeof(T).Name);
writer.WriteValue(item);
writer.WriteEndElement();
我不知道怎样才能完成这样的任务。CLR对由ref封送的对象做了类似的事情,但我怀疑它是否允许您以这种方式“重命名”类或其属性(字段)
最好的方法是遵循旧代码,或者(更好的方法)替换或更改序列化例程,使其不那么严格。否,您不能在运行时更改
类型的.Name
。但是,大多数序列化库允许您通过提供自定义“活页夹”(etc)或使用属性注释类型来指示要使用的首选名称,从而对名称的处理进行某种控制(注意:大多数允许属性的库也允许通过序列化库的运行时配置提供名称)
那么,一个重要的问题是:这里使用的序列化库是什么
如果序列化库不支持这一点,并且无法更改,那么所有这一切的唯一替代方法(除了重命名Sample
)是创建一个类型(手动或在运行时通过TypeBuilder
)这看起来像原始类型,但代码不同,类似地:创建在两种类型之间转换的代码。至于使用BCL中的XmlSerialization
库进行XML序列化,您可以使用以下属性覆盖要生成的XML元素名称:
[XmlElement("SomeOtherName")]
public class Sample{...}
在您的问题中,您提到要在序列化期间控制名称
如果要在序列化过程中更改名称,可以使用以下属性
[DataContract(Name = "NewName")]
[XmlRoot("NewName")]
class Sample
{
}
当说name时,你是指变量的名称吗?@CodeCaster“因为一些我无法控制的代码正在使用它来获取要序列化的值。”是contextFor info,我通过.name
实现,它基本上终止于一个非托管函数:[SecurityCritical,SuppressUnmanagedCodeSecurity,DllImport(“QCall”),CharSet=CharSet.Unicode)]私有静态外部无效构造函数名称(RuntimeTypeHandle句柄,TypeNameFormatFlags formatFlags,StringHandleOnStack retString)
。因此,如果有欺骗的方法,它是完全秘密的,没有文档记录的。您不能使用XML操纵类在以后更改生成的XML吗?好主意;xslt重命名一个完全取决于所使用的序列化库的元素是非常简单的;使用的方法有很大的不同,这取决于整个序列化库y取决于所使用的序列化库;使用方法各不相同hugely@MarcGravell是的,我特别提到的是xmlsialization
lib。谢谢,但这不是我的选项,因为我使用的是一个自定义序列化库,它在源代码中使用“typeof(T).Name…”在这种情况下,您的选项是:1)使用它,2)在代码中更改类示例的名称,3)添加单独的DTO类型,仅用于序列化,4)编写大量代码以自动生成具有不同名称的DTO。我怀疑我会选择“2”或“3”。如果已经有一个类TheNameIWant
?然后,我无法重命名示例
,也无法在运行时创建类型…@最后,您可以在不同的命名空间中创建类型。