我正在尋找方法來改進我正在處理的應用程序中的一些代碼的一致性,簡潔性和可讀性。起始代碼看起來像這樣:帶有泛型類型參數的C#擴展方法
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => e.Execute((Bar)instance.Instance)
);
有許多幾乎與上面相同的代碼行。我想改寫它看起來是這樣的:
typeof(Bar).SubscribeTo<Fizz>(context);
一方面,這將使我採取什麼正規化已經成爲一種非正式會議的優勢。另外,我希望它現在可以閱讀「bar在特定上下文中訂閱fizz事件」的內容,而不是「上下文獲取條形式並訂閱嘶嘶聲,然後執行某些操作」。我認爲流程是更好,我問過同事的同事。
我開始實施這個作爲擴展方法。爲了實現上述目的,我想使用抽象的泛型基類作爲事件類型,所以Fizz
應該是Event<T>
。這將意味着擴展方法的泛型類型參數必須被約束爲擴展方法被調用的類型。因此,對於上述示例,Fizz
必須是Event<Bar>
。
這可能嗎?在此期間,我採取了另一種解決方案,但我仍然很好奇它是否可以實現。其他建議也歡迎。
謝謝!
編輯#1:要清楚,我意識到我可以使用一個額外的類型參數,但我正在尋找方法來避免這種情況。
編輯#2: 我想我會接受接受答案的細微變化,因爲它與我的場景不匹配100%。底線是可以使用泛型靜態類來代替Type的擴展方法來實現我的目標。謝謝dss539!
更新代碼(有可能是拼寫錯誤,因爲我在飛行中這樣做):
public class Bar { }
public class Event<TSubscriber>
{
public abstract void Execute(TSubscriber source);
}
public class Fizz : Event<Bar>
{
public override void Execute(Bar bar)
{
// respond to event
}
}
public class Context { }
public static class ForType<TSubscriber>
{
public static void SubscribeTo<TEvent>(Context context)
where TEvent : Event<TSubscriber>
{
context.GetType<TSubscriber>().Subscribe<TEvent>(
(evt, args) => evt.Execute((TSubscriber)args.Source));
}
}
public static void Run()
{
ForType<Bar>.SubscribeTo<Fizz>(context);
}
我不太明白你的問題。你現有的方法簽名是什麼樣的? '訂閱(這種類型,動作)'?如果你顯示你有什麼(或相當的),這可能有助於解釋。 –
dss539
2010-06-25 14:48:08
我想我有一個類似的設計問題。祝你好運:) – leppie 2010-06-25 14:48:30
@ dss539 它會更像訂閱(這種類型,上下文ctx)。問題是,我沒有辦法(我知道)將T約束爲Event 類型。 –
2010-06-25 15:07:11