2013-09-27 72 views
1

我正在嘗試設置一個測試工具,並且我想將一些數據包含在XML格式的項目中,並將其加載到測試預設置方法中的業務對象中。c#LINQ to XML測試數據加載

類結構是

public class DbUserChoice 
    { 
     public int Id { get; set; } 
     public string Description { get; set; } 
    } 
public class DbUserAmbition : DbUserChoice { } 
public class DbUserDiet : DbUserChoice { } 
public class DbUserEthnicity : DbUserChoice { } 
etc... 

因此,有一個抽象基類DbUserChoice,然後由所有不同類型的選擇用戶具有擴展(15個)。除此之外,所有這些都不會給課堂增加任何內容,只是逐字地擴展它。

的XML結構(部分)

<UserChoiceOptions> 
    <UserChoice ChoiceType="DbUserAmbition"> 
    <Choice>I'm content to just sit back and enjoy life</Choice> 
    <Choice>I have a few ambitions and dreams but keep my feet on the ground</Choice> 
    <Choice>I'm quite ambitious and driven in my career and personal life</Choice> 
    <Choice>I'm extremely driven to succeed and want the very best from life</Choice> 
    </UserChoice> 
    <UserChoice ChoiceType="DbUserBodyType"> 
    <Choice Gender="M">Slim</Choice> 
    <Choice Gender="M">Athletic and toned</Choice> 
    <Choice Gender="M">A healthy medium</Choice> 
    <Choice Gender="M">Muscular</Choice> etc... 

我想某種通用的方法,我可以通過一個數據類型來,並返回我映射到數據類型的XML的選擇的一個IQueryable ,由上面UserChoice節點上的「ChoiceType」標識符屬性選擇。

var ambitions = TestUtil.ReadXMLObjects<DbUserAmbition>(xmlFilePath); 

將返回我的上述4個選項

15用戶選擇的類型會表現這樣的14的IQueryable<DbUserAmbition>。唯一不同的是上面提到的DbUserBodyType,您可以看到這在每個Gender的記錄上都有一個附加屬性。這是DbUserBodyType類的一個新屬性,它是向基類添加新記錄的唯一派生類,並且此Woudl也需要從該XML屬性彈出。

我一直在嘗試使用Linq到XML來實現這一點,但我似乎無法完全理解它。下面的代碼給了我一個XElements的列表,但我看不到如何輕鬆並乾淨地將它轉換爲C#DbUserAmbition對象列表,例如不使用混亂的反射。

var element = XElement.Load(_xmlPath); 
      var typeName = typeof(T).Name; 

      var nodes = from n in element.Elements("UserChoiceOptions/UserChoice/Choice") 
         where n.Parent.Attribute("ChoiceType").Value.Equals(typeName, StringComparison.CurrentCultureIgnoreCase) 
         select n; 

任何意見將受到歡迎

回答

0

好了,你可以通過聲明它會從XML解析數據的方法實現這一目標:

public class DbUserChoice 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 

    public virtual void Parse(XElement node) 
    { 
     //assign properties from XElement here 
     //override this method in DbUserBodyType to add additional logic 
    } 
} 

然後將查詢將結束

return nodes.Select(n => { var x = new T(); x.Parse(n); return x; }).AsQueryable(); 

這將增加一個限制T : DbUserChoice, new()到你的泛型方法,但那肩膀d不是問題