2012-07-30 95 views
0

我在设计使用命令模式但泛型的解决方案时遇到了一些麻烦。基本上,我定义了一个通用接口,它只有一个返回通用对象列表的方法。通用泛型列表

public interface IExecute<T> 
{ 
    List<T> Execute(); 
} 

public class SimpleExecute : IExecute<int> 
{ 
    public List<int> Execute() 
    { return a list of ints... } 
} 

public class Main 
{ 
    private List<IExecute<T>> ExecuteTasks; // This is not valid in C# 
} 

由于仿制药的泛型列表是无效的,我实现了一个非通用接口IExceute并提出了通用接口扩展非泛型之一,是能够创建一个列表

public interface IExecute {} 

public interface IExecute<T> : Execute 
{ 
    List<T> Execute(); 
} 

private List<IExecute> ExecuteTasks; 

但是,现在我不确定如何循环ExecuteTasks并调用execute方法。

我尽力解释了这个问题。请让我知道你是否需要我的问题的进一步解释。

感谢

+3

如果'IExecute'的实例不是全部都是相同的类型,那么泛型提供了什么好处? – mellamokb 2012-07-30 21:31:53

+0

因此,每个'Execute()'返回'List '对于一些未知的'T'。你想对结果做什么? – svick 2012-07-30 21:34:45

+0

我将使用反射和类型信息来确定对象类型并根据对象的属性信息确定工作表的名称,然后将它们写回到Excel电子表格中。 – user320587 2012-07-30 21:42:33

回答

2

你能做的最好的是这样的:

public interface IExecute { IList Execute(); } 

然后,例如:

public class SimpleExecute : IExecute<int> 
{ 
    public List<int> Execute() 
    { return a list of ints... } 
    IList IExecute.Execute() { return this.Execute(); } 
} 

(注意非明确的接口成员实现通用IExecute.Execute()

然后:

List<IExecute> iExecuteList = //whatever; 
foreach (var ix in iExecuteList) 
{ 
    IList list = ix.Execute(); 
} 

你不能在编译时具体的泛型列表类型(例如,IList<string>IList<int>)出于同样的原因,不能将一个int,并在同一个通用列表string(除非类型参数是object)。

0

尝试使用foreach遍历每个项目的循环:

foreach(var item in ExecuteTasks) 
{ 
    item.Execute(); 
    //... 
} 
1
public class Main 
{ 
    private List<IExecute<T> ExecuteTasks; // This is not valid in C# 
} 

有2个错误的位置:

  • T是一个未知的类。您应该指定了正确的类型

  • 列表<没有右括号'>'。每个开放支架必须有一个闭合的支架。它应该看起来像List<IExecute<T>>

+0

我认为这里的要点是它应该是一个具有不同'T'的任务列表。 – svick 2012-07-30 21:37:34

+0

1.是的,这就是问题的要点...... 2.很明显OP是一个错字。 – mellamokb 2012-07-30 21:37:46

+0

我知道这不是他想听到的答案,但他犯了一些错误,我试图纠正它们。 – HeM01 2012-07-30 21:39:18

1
List<IExecute<T>> ExecuteTasks 

无效,因为T在包含类中的任何地方都没有定义。

像这样的东西应该工作而不是虽然:

List<IExecute<Object>> ExecuteTasks; 

ExecuteTasks.Add(new SimpleExecute()); 

或者

public class Main<T> 
{ 
    List<IExecute<T>> ExecuteTasks 
} 
0

当您使用泛型,认为IExecute<Class1>IExecute<Class2>一个完全不同的接口。在这种情况下,如果您要在两者中调用通用方法,则需要另一个接口;例如IExecute

public interface IExecute<T> 
{ 
    List<T> Execute(); 
} 

public interface IExecute 
{ 
    IList Execute(); 
} 

public class SimpleExecute : IExecute<int>, IExecute 
{ 
    IList IExecute.Execute() 
    { 
     return Execute(); 
    } 

    public List<int> Execute() 
    { 
     return new List<int>(); 
    } 
} 

然后,循环,你可以简单地使用foreach和/或LINQ。

List<IExecute> entries = new List<IExecute> {new SimpleExecute()}; 

foreach (var result in entries.Select(x => x.Execute())) 
{ 
} 

什么你正在努力实现似乎是正确的,因为你认为IExecute作为一个单一的接口,但实际上它是一个“模板”,这将在编译时创建的接口。