我有一个将XML反序列化为特定用户定义类型(Product Class)的方法。
public Class Product
{
public int ID{ get; set; }
public string ModelNumber { get; set; }
public string SKU { get; set; }
public string Att4 { get; set; }
public string Att5 { get; set; }
}
此方法将接受XML对象并读取其属性并返回产品类。我有条件当XML为空时我想返回一个像{}这样的空对象。这是我的反序列化方法:
public static Product DeserializeXmlAsParentProduct(object xml)
{
if (xml == DBNull.Value)
return // I want to return {};
var doc = XDocument.Parse(xml.ToString());
var product = doc.Descendants("row").Select(pd => new Product
{
ID = GetValue<int>(pd.Element("ID")),
ModelNumber = GetValue<string>(pd.Element("ModelNumber")),
SKU = GetValue<string>(pd.Element("SKU"))
})
.ToList().FirstOrDefault();
return product;
}
当从DB中检索到值时,我的输入XML将如下所示:
<root>
<row>
<ID>8</ID>
<ModelNumber>GT</ModelNumber>
<SKU>UR</SKU>
<row/>
</root>
如果满足条件,如何返回空对象?
如果一切顺利的话。它将为我返回一个具有所有属性的产品类。
{ID, ModelNumber, SKU, Att4, Att5}`
如何使用LINQ仅返回前三个属性?像这样:
{ID, ModelNumber, SKU}
我在考虑使用动态对象。有没有其他方法来实现这一目标?
感谢任何帮助。
答案 0 :(得分:2)
使用Linq构建匿名实例:
var anonResults = list.Select( p => new {p.ID, p.ModelNumber, p.SKU });
但是,在此示例中,不能 return
anonResults
。匿名类仅在首次声明它们的范围内有效。
如果真的想要动态地执行此操作,javascript样式,我会使用ExpandoObject
我的建议只是返回完整的对象。如果您想限制访问到Att4
和Att5
,请考虑在Product
上实施一个仅声明ID
,ModelNumber
的界面和SKU
:
public interface IProduct
{
int ID{ get; set; }
string ModelNumber { get; set; }
string SKU { get; set; }
}
public Class Product : IProduct
{
public int ID{ get; set; }
public string ModelNumber { get; set; }
public string SKU { get; set; }
public string Att4 { get; set; }
public string Att5 { get; set; }
}