Привет, я не уверен, что общий метод - это правильный способ решить мою проблему. Мне нужно разобрать XML-файл и прочитать его. Элементы могут быть такими, как orderLines, заметки, вложения. Основные шаги для получения этих элементов - все те же. Как я могу создать 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.
ли классы: OrderLine , Примечание и другие реализуют интерфейс ISortableByLineNumber? – VS1
Да, все они реализуют этот интерфейс. Я еще не вызываю функцию, поэтому это ошибка времени компиляции, а не ошибка времени выполнения. –
, то я предполагаю, что вы должны использовать типы интерфейса в отличие от конкретных типов в параметрах метода, я написал ответ для этого. – VS1