识别类中指定的XML序列化规则
本文关键字:XML 序列化 规则 识别 | 更新日期: 2023-09-27 18:07:14
是否可以这样做:
在我的代码的另一部分创建一个 someeclass 的实例AND
使用这个新创建的实例/对象,我可以获得:
[System.Xml.Serialization.XmlElementAttribute("someClass")]XML序列化规则
我想要达到的目标:
1. 确定 someeclass 是否在其中的任何属性上包含XML序列化规则
2. 如果它确实包含这样的序列化规则,标识规则。(也就是说,它是否……XMLIgnore || XMLElement || XMLAttribute…等)
问题中提到的类:
Class SomeClass
{
SomeOtherClass[] privtArr;
[System.Xml.Serialization.XmlElementAttribute("SomeOtherClass")]
public SomeOtherClass[] anInstance
{
get
{
return this.privtArr;
}
set
{
this.privtArr = value;
}
}
}
你不需要创建一个实例;只要看看Type
,特别是GetFields()
和GetProperties()
。循环遍历公共非静态字段/属性,并检查Attribute.GetCustomAttribute(member, attributeType)
-即
public class Test
{
[XmlElement("abc")]
public int Foo { get; set; }
[XmlIgnore]
public string Bar { get; set; }
static void Main()
{
var props = typeof (Test).GetProperties(
BindingFlags.Public | BindingFlags.Instance);
foreach(var prop in props)
{
if(Attribute.IsDefined(prop, typeof(XmlIgnoreAttribute)))
{
Console.WriteLine("Ignore: " + prop.Name);
continue; // it is ignored; stop there
}
var el = (XmlElementAttribute) Attribute.GetCustomAttribute(
prop, typeof (XmlElementAttribute));
if(el != null)
{
Console.WriteLine("Element: " + (
string.IsNullOrEmpty(el.ElementName) ?
prop.Name : el.ElementName));
}
// todo: repeat for other interesting attributes; XmlAttribute,
// XmlArrayItem, XmlInclude, etc...
}
}
}
如果需要创建实例,请使用new
或Activator.CreateInstance
。
你甚至不需要实例化SomeClass
使用反射来列出typeof(SomeClass)
的(公共)字段和属性。然后,对于每个字段/属性,枚举属性并过滤您感兴趣的属性(例如XmlElement()
, XmlAttribute()
,…)
注意,XmlSerializer
序列化公共字段和属性,即使它们没有XmlBlah
属性。除非它们被标记为[XmlIgnore()]
,否则它们是序列化的。然后,您也应该查找此属性。
当然,您也可能对类级别的Xml属性感兴趣。