嗨我不確定一個通用的方法是解決我的問題的正確方法。我需要解析一個XML文件並從中讀取項目。項目可以是orderline,notes,attachments等。獲得這些項目的基本步驟都是一樣的。我如何創建1個方法來創建這些項目的列表並調用特定的方法來讀取項目?我可以使用泛型方法作爲一種模板模式嗎?
public override IList<T> GetItems<T>(XPathNavigator currentOrder) where T : ISortableByLineNumber, new()
{
var itemList = new List<T>();
var itemXmlNodes = currentOrder.Select(OrderXPath);
if (itemXmlNodes == null)
throw new Exception("");
var lineNumber = 1;
foreach (XPathNavigator itemXmlNode in itemXmlNodes)
{
var item = new T();
item = ReadItem(itemXmlNode, lineNumber++, item);
itemList.Add(item);
Logger.Debug(string.Format("Added item {0}", item));
}
return itemList;
}
我想我可以用ReadItem方法做到這一點。我會爲我將要閱讀的每種類型的項目創建重載。
private ISortableByLineNumber ReadItem(XPathNavigator itemXmlNode, int i, OrderLine item)
{
// specific code to read a orderLine
}
private ISortableByLineNumber ReadItem(XPathNavigator itemXmlNode, int i, Note item)
{
// specific code to read a note
}
但是,當我嘗試編譯這個我能得到「的最佳重載方法匹配‘XmlOrderParser.XmlOrders.Prs3XmlFileWithOrders.ReadItem(System.Xml.XPath.XPathNavigator類,INT,XmlOrderParser.Entities.OrderLine)’有一些無效的論點「。問題是編譯器不知道如何將T轉換爲OrderLine或Note。
dynamic item = new T(); // instead of var item = new T();
因爲item
現在是dynamic
運行並根據實際類型自動重載解析:
請問您的類:訂單行,Note和其他的實現接口ISortableByLineNumber? – VS1
是的,他們都實現了該接口。我還沒有調用函數,所以這是一個編譯時錯誤,而不是運行時錯誤。 –
那麼我想你應該使用接口類型而不是你的方法參數中的具體類型,我已經爲此發佈了一個答案.. – VS1