我想寫一些能夠採取各種行爲類,並將它們鏈接到查詢和命令鏈。我採取的一種方法是在下面,但我遇到了將派生類型轉換爲基類型的問題。我不得不處理泛型參數,而且我不確定這種方法是不可能的,或者我需要定義一些隱式或顯式轉換運算符,或者完全是其他的。鑄造到少衍生類型和處理泛型
這是一組基本類型。首先是最基本的接口:
public interface IInvoker
{
void Invoke();
}
這個抽象類增加了有一個「主題」,它是通過其成員之一是否命令或查詢的東西的能力。它會延遲執行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循環中的第一次投射不起作用(第二次也許不會,我猜測)。錯誤信息看起來是這樣的:
我希望有一些方法來解決這個問題,而無需實現每個具體祈求什麼特別的事。我最終可能會有幾十個這樣的具體類,每個類都使用泛型類型參數的不同類型。那麼,有沒有辦法來解決這個問題?
在你的榜樣的名稱不一致。例如'IActionInvoker'沒有顯示在任何地方。請發佈可編譯的真實代碼。 –
@JesseGood - 修正。 – bubbleking