У меня есть несколько методов, которые считывают данные из XML, имеющие следующий формат:Как создать метод/s generic, который возвращает разные типы, но принимает тот же тип экземпляра?
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<document>
<employee>
<name>
<lastname>Sample</lastname>
<firstname>Test</firstname>
</name>
<professionalDetails>
<hiredate>October 15, 2016</hiredate>
<designation>Clerk</designation>
</professionalDetails>
<projects>
<project>
<product>Printer</product>
<id>111</id>
<price>$111.00</price>
</project>
<project>
<product>Laptop</product>
<id>222</id>
<price>$989.00</price>
</project>
</projects>
</employee>
</document>
Чтобы прочитать приведенные выше данные, у меня есть следующие методы с их соответствующими классами.
- Пожалуйста, обратите внимание, что у меня есть собственная реализация метода «GetElementAsString». Потерпите меня за то, что вы не обеспечиваете ее реализацию.
Методы:
private static NameDetails GetsNameDetails(XNode content)
{
var element = content.XPathSelectElement("document/employee/name");
return new NameDetails
{
FirstName = element.GetElementAsString("firstName"),
LastName = element.GetElementAsString("lastName")
};
}
private static ProfessionalDetails GetsProfessionalDetailsDetails(XNode content)
{
var element = content.XPathSelectElement("document/employee/professionalDetails");
return new ProfessionalDetails
{
HireDate = element.GetElementAsString("hiredate"),
Designation = element.GetElementAsString("designation")
};
}
private static Projects GetsProjectDetails(XNode content)
{
var element = content.XPathSelectElement("document/employee/projects/project");
return new Projects
{
Id = element.GetElementAsString("id"),
Price = element.GetElementAsString("price"),
Product = element.GetElementAsString("product")
};
}
}
internal class Projects
{
public int Id { get; set; }
public string Product { get; set; }
public string Price { get; set; }
}
internal class ProfessionalDetails
{
public DateTime HireDate { get; set; }
public string Designation { get; set; }
}
internal class NameDetails
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Основная логика одинакова для обоих методов. Инициализирующий тип - это единственное, что меняется. Возвращаемое значение метода и свойства/поля, подлежащие инициализации, изменяются, но параметр остается неизменным.
Как получить один общий метод для нижеописанных методов и решить, какой тип будет инициализирован во время выполнения?
Пусть мне поставить выше по-другому. Было бы неплохо иметь только один общий метод вместо нескольких методов с одинаковой логикой, который, конечно, проще –