在我的代码的另一部分中创建 SomeCLass 的实例 使用此新创建的实例/对象,我可以获得:
[System.Xml.Serialization.XmlElementAttribute( “SomeClass的”)] XML序列化规则
我想要实现的目标:
1.确定 SomeCLass 是否在其中的任何属性上包含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;
}
}
}
答案 0 :(得分:2)
您不需要创建实例;只需查看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
。
答案 1 :(得分:1)
您甚至不需要实例化SomeClass。
使用Reflection列出typeof(SomeClass)
的(公共)字段和属性。
然后,对于每个字段/属性,枚举属性并过滤您感兴趣的属性(例如XmlElement()
,XmlAttribute()
,...
但请注意,XmlSerializer
序列化公共字段和属性,即使它们没有XmlBlah
属性也是如此。它们被序列化,除非它们被标记为[XmlIgnore()]
。然后,您也应该查找此属性。
当然,您可能也对类级别的Xml属性感兴趣。