我正在嘗試設置一個測試工具,並且我想將一些數據包含在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;
任何意見將受到歡迎