0

コマンドパターンを使用するがジェネリックを使用するソリューションの設計に問題があります。基本的に、ジェネリック オブジェクトのリストを返すメソッドを 1 つだけ持つジェネリック インターフェイスを定義しました。

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();
}

同じジェネリック リストに anと aを格納できないのと同じ理由で (型引数が でない限り) 、コンパイル時に特定のジェネリック リスト型 (たとえば、IList<string>, ) を取得することはできません。IList<int>intstringobject

于 2012-07-30T21:42:41.400 に答える
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 に答える
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 に答える
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 に答える
0

ループを使用してすべてのアイテムをループしてみてくださいforeach

foreach(var item in ExecuteTasks)
{
    item.Execute();
    //...
}
于 2012-07-30T21:32:44.393 に答える