Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能否在运行时更改类型的Name属性的值?_C#_Reflection - Fatal编程技术网

C# 能否在运行时更改类型的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封送的对象做了类似的事情,但我怀疑它是否允

是否可以更改/重写类型的Name属性

给定类定义:

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
?然后,我无法重命名
示例
,也无法在运行时创建类型…@最后,您可以在不同的命名空间中创建类型。