C#通用接口,通用实现,类型化方法

时间:2012-02-06 09:20:30

标签: c# generics

我正在尝试通过实现来获取用于处理我的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() {

希望你有我的建议:)

1 个答案:

答案 0 :(得分:4)

嗯,在这种情况下,您可以通过object进行投射:

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

object强制转换首先强制编译器将其视为&#34; normal&#34;铸造。

...但我个人觉得这会产生一种设计气味,你可能应该用非泛型方法创建一个通用的接口,并实现ILoadable<TicketData>或其他。基本上你的方法不是真的泛型 - 它具有针对特定类型的特定处理,这应该总是让你怀疑你的设计是否真的合适。