最好的解決辦法是讓自己的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;
}
這都是概念性的,所以你可能需要從這裏「推出自己的」解決方案。另一種方法是使用擴展方法爲xml反序列化對象返回一個IEnumerable<field>
,如果要以非性能密集型方式使用它,這將是可行的。
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;
}
}
您需要完全控制反序列化過程;看起來像這些字段可以創建一個不錯的KeyValuePair。在我的手機上,現在無法真正給出答案,但我會研究如何實現ISerializable。 – 2013-04-09 12:09:03