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 方法。

我已尽力解释这个问题。如果您需要进一步解释我的问题,请告诉我。

谢谢

4

5 回答 5

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>,原因与您无法将 anint和 a存储string在同一个泛型列表中的原因相同(除非类型参数是object)。

于 2012-07-30T21:42:41.400 回答
1
public class Main
{
   private List<IExecute<T> ExecuteTasks; // This is not valid in C#
}

这里有2个错误:

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

  • List< 没有右尖括号“>”。每个左括号必须有一个右括号。它应该看起来像List<IExecute<T>>

于 2012-07-30T21:36:38.983 回答
1
List<IExecute<T>> ExecuteTasks 

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

像这样的东西应该可以代替:

List<IExecute<Object>> ExecuteTasks;

ExecuteTasks.Add(new SimpleExecute());

或者

public class Main<T>
{
    List<IExecute<T>> ExecuteTasks 
}
于 2012-07-30T21:47:40.570 回答
0

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

foreach(var item in ExecuteTasks)
{
    item.Execute();
    //...
}
于 2012-07-30T21:32:44.393 回答
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 视为单个接口,但实际上它是在编译时创建的接口的“模板”。

于 2012-07-30T21:53:19.447 回答