2012-02-06 95 views
0

我要去跟implentation一个通用的接口,用于处理我的XML: IXmlServiceC#通用接口,通用器具,类型化的方法

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() { 

希望你有和建议对我来说:)

+1

你没有真正提出问题。这就是说,对泛型使用'typeof'通常是一个代码异味 – 2012-02-06 09:24:41

回答

4

那么,在这种情况下,你可以只投,通过object打算:

if (typeof(T) == typeof(TicketData)) 
{ 
    return (List<T>) (object) XmlTicketService.LoadInternal(); 
} 

object投第一基本上迫使编译器把它作为“正常”演员。

...但我个人认为,提出了设计的味道,在这里你可能应该创建一个通用的接口非泛型方法,以及实施ILoadable<TicketData>或什么的。基本上你的方法不是真的泛型 - 它具有特定类型的特定处理,这应该总是让你怀疑你的设计是否真的合适。

+0

我已经尝试了演员,没有工作。我想,我会重新设计我的设计到通用接口和类型的工具。 – Mav 2012-02-06 09:47:01

+0

@ user1191900:“没有工作”不完全是描述性的。当你尝试时发生了什么? – 2012-02-06 09:47:39

+0

无法显式强制转换列表转换成列表 Mav 2012-02-06 10:27:58