能否更改/覆盖类型的Name属性?
给定类定义:
class Sample
{}
您能更改typeof(Sample).Name
返回的值吗?
我正在使用定制序列化库,它在源代码中直接使用typeof(T).Name
:
writer.WriteStartElement(typeof(T).Name);
writer.WriteValue(item);
writer.WriteEndElement();
能否更改/覆盖类型的Name属性?
给定类定义:
class Sample
{}
您能更改typeof(Sample).Name
返回的值吗?
我正在使用定制序列化库,它在源代码中直接使用typeof(T).Name
:
writer.WriteStartElement(typeof(T).Name);
writer.WriteValue(item);
writer.WriteEndElement();
Type
的.Name
。但是,大多数序列化库允许你通过提供自定义“绑定器”(等等)或通过使用属性注释类型来指示首选名称来控制名称处理(请注意:允许属性的大多数库也允许通过序列化库的运行时配置提供名称)。Sample
之外,唯一的选择是创建一个类型(手动创建或通过TypeBuilder
在运行时创建),该类型看起来像原始类型,但具有不同的代码,并且类似地:创建将两种类型之间进行转换的代码。TheNameIWant
的类,那么我就无法重命名Sample
或在运行时创建类型了... - lastr2d2XmlSerialization
库进行XML序列化,您可以使用以下属性覆盖要生成的xml元素名称:[XmlElement("SomeOtherName")]
public class Sample{...}
XmlSerialization
库。 - Yair Nevet根据您的问题,您提到您想在序列化过程中控制名称。
如果您想在序列化过程中更改名称,您可以使用以下属性
[DataContract(Name = "NewName")]
[XmlRoot("NewName")]
class Sample
{
}
.Name
的实现,发现它基本上在一个非托管函数中终止:[SecurityCritical, SuppressUnmanagedCodeSecurity, DllImport("QCall", CharSet=CharSet.Unicode)] private static extern void ConstructName(RuntimeTypeHandle handle, TypeNameFormatFlags formatFlags, StringHandleOnStack retString)
。因此,如果有欺骗这个函数的方法,那么它是完全保密和未记录的。 - Marc Gravell