最好的解决方案是让您自己的IXmlSerializable
实现来使用有问题的 xml。预先做会很麻烦,但从长远来看可能是值得的。
作为替代方案(我不会太强烈推荐它),您可以编写一个小技巧来反映默认序列化对象的属性 - 您解释的那个是由内置实用程序生成的。
例如,假设:
公共类字段 { 公共字符串名称;公共字符串值;}
public class response
{
public Field field1;
public Field field2;
public Field field3;
public Field field4;
public Field field5;
public Field field6;
public Field field7;
public string comments;
public string osmp_txn_id;
public string result;
}
您可以定义以下“便利”类:
public class myResponse
{
public string comments;
public string osmp_txn_id;
public string result;
public List<Field> fields;
}
这将是如何填充更方便的类:
myResponse ConvertFromResult(response target)
{
var returnObject = new myResponse();
var fields = target.GetType().GetFields().Where(f => f.FieldType == typeof(Field));
returnObject.fields = (from f in fields
let fp = f.GetValue(target) as Field
where fp != null
select fp).ToList();
returnObject.comments = target.comments;
returnObject.osmp_txn_id = target.osmp_txn_id;
returnObject.result = target.result;
return returnObject;
}
这都是概念性的,因此您可能需要从这里开始“推出自己的”解决方案。另一种选择是使用扩展方法IEnumerable<field>
为 xml 反序列化对象返回一个,如果您打算以非性能密集型方式使用它,这将是可行的。
public static class responseExtensions
{
private static IEnumerable<Field> GetFields(this response target)
{
var fields = target.GetType().GetFields().Where(f => f.FieldType == typeof(Field));
return from f in fields
let fp = f.GetValue(target) as Field
where fp != null
select fp;
}
}