私は様々なビヘイビアクラスを取得し、それらをまとめて一連のクエリとコマンドにリンクすることができます。私が取ったアプローチは以下の通りですが、型を派生させて型を基底クラスにキャスティングする問題が発生しています。私はジェネリックパラメータを扱う必要があります。このアプローチが不可能なのか、何らかの暗黙的または明示的な変換演算子を定義する必要があるのかどうかはわかりません。より少ない派生型へのキャストとジェネリックの扱い
ここには基本タイプのセットがあります。
public interface IInvoker
{
void Invoke();
}
この抽象クラスは、そのメンバーのうちの1つを介してコマンドまたはクエリを行うものである「件名」を持っている機能を追加します:まず、最も基本的なインタフェースです。これは、Invokeメソッドを実装延期:
public abstract class AbstractInvoker<TSubject> : IInvoker
{
protected TSubject Subject;
public void SetSubject(TSubject subject)
{
Subject = subject;
}
public abstract void Invoke();
}
この次の抽象クラスは、任意の具体的なクエリクラスによって実装タイプ(TResultタイプを持っていないコマンドとは対照的に)なります。これは、サクセサを介してクエリを連鎖させる機能を設定します。
public abstract class AbstractQueryInvoker<TSubject, TResult> : AbstractInvoker<TSubject>
{
protected AbstractInvoker<TResult> Successor;
public void SetSuccessor(AbstractInvoker<TResult> successor)
{
Successor = successor;
}
public override void Invoke()
{
var result = DoQuery();
Successor.SetSubject(result);
Successor.Invoke();
}
protected abstract TResult DoQuery();
}
実際のクエリロジックは、DoQuery()
メソッドを使用して具象クラスに実装されています。
私はこのようにそれを設定するので、私はこのように一緒にクエリをチェーンできます
private List<IInvoker> _invokers;
// Build the list of various concrete classes
for (int i = 0; i < _invokers.Count - 1; i++)
{
((AbstractQueryInvoker<dynamic, dynamic>)_invokers[i]).SetSuccessor(
(AbstractInvoker<dynamic>)
_invokers[i + 1]);
}
その後継者は、私はすべてのように、ここまで連鎖している私の目的は、最後のものを除いて、各呼び出しを持っていることでした最初の要素にInvoke()
と呼ぶことが必要です。しかし、forループの最初のキャストは機能しません(そして2番目のキャストはどちらでもないかもしれません、私は推測しています)。私はそれぞれの具体的な実行者に特定の何かを実装することなく、これを回避するにはいくつかの方法がある願ってい
:エラーメッセージは次のようになります。私はこれらの具体的なクラスの数十を持っている可能性があり、それぞれジェネリック型のパラメータに異なるタイプを使用します。ですから、これを改善する方法はありますか?
名前あなたの例では、一貫していません。例えば、 'IActionInvoker'はどこにも表示されません。コンパイル可能な実際のコードを投稿してください。 –
@JesseGood - 修正されました。 – bubbleking