我正在尝试通过实现来获取用于处理我的xml的通用接口: 的 IXmlService
List<T> Load<T>() where T : class;
XmlService
public List<T> Load<T>() where T : class {
Type type = typeof(T);
if (type == typeof(TicketData)) { return XmlTicketService.LoadInternal(); } // Error: Unable to cast from List<TicketData> to List<T>
XmlTicketService.LoadInternal()知道类型,应该返回服务
internal static List<TicketData> LoadInternal() {
List<TicketData> result = new List<TicketData>();
ThreadPool.QueueUserWorkItem(
delegate {
try {
XDocument data = XDocument.Load(_xmlPath);
var query = (from element in data.Root.Descendants("Ticket")
select new TicketData() {
希望你有我的建议:)
答案 0 :(得分:4)
嗯,在这种情况下,您可以通过object
进行投射:
if (typeof(T) == typeof(TicketData))
{
return (List<T>) (object) XmlTicketService.LoadInternal();
}
object
强制转换首先强制编译器将其视为&#34; normal&#34;铸造。
...但我个人觉得这会产生一种设计气味,你可能应该用非泛型方法创建一个通用的接口,并实现ILoadable<TicketData>
或其他。基本上你的方法不是真的泛型 - 它具有针对特定类型的特定处理,这应该总是让你怀疑你的设计是否真的合适。