2013-11-25 59 views
0

我有一种将XML反序列化为特定用户定义类型(Product Class)的方法。c#如何返回用户定义类型的空对象?

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; 
     } 

我在放XML将看起来像这样当值从DB中检索:

<root> 
<row> 
    <ID>8</ID> 
    <ModelNumber>GT</ModelNumber> 
    <SKU>UR</SKU> 
<row/> 
</root> 

我怎样才能返回空对象,如果条件得到满足?

另外如果一切顺利。它会为我返回一个包含所有属性的产品类。

{ID, ModelNumber, SKU, Att4, Att5}` 

如何使用LINQ仅返回前三个属性?像这样:

{ID, ModelNumber, SKU} 

我正在考虑使用动态对象。有没有其他方法可以实现这一目标?

任何帮助表示赞赏。

+0

如果你正在做对象序列化的一个很大的问题,我建议使用这种方法的HTTP ://msdn.microsoft.com/en-us/library/tz8csy73%28v=vs.110%29.aspx – Gusdor

+0

此外,我不禁质疑存储在数据库中的值为xml的智慧。 – Gusdor

+0

实际上,我不是将数据以DB的形式存储在数据库中,但是我将它们作为XML检索。我正在使用这个SQL Sever选项:SELECT P.ID,P.ModelNumber,P.SKU FOR XML RAW,ELEMENTS,ROOT('root')。 – user123456

回答

2

使用LINQ构建匿名实例:

var anonResults = list.Select(p => new {p.ID, p.ModelNumber, p.SKU }); 

然而,在这个例子中,你不能returnanonResults。匿名类仅在其首次声明的范围内有效。

如果你真的想这样做动态,JavaScript的风格,我会用ExpandoObject

我的建议是只返回完整的对象。如果你想限制访问Att4Att5,考虑Product只有声明IDModelNumberSKU实现一个接口:

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; } 
} 
+0

谢谢你的回答。 – user123456

相关问题