この質問をする方法さえわからないので、コード例を示します。
ドメインは次のとおりです。
public interface ISubscriptionProvider<T>
{
void Subscribe(Action<T> callback);
}
public class Notification {}
public class CurrentUserNotifications : ISubscriptionProvider<Notification>
{
public void Subscribe(Action<Notification> callback) { }
}
これが私が魔法にしたい方法です:
public void Subscribe<P, T>(Action<T> callback) where P : ISubscriptionProvider<T>
{
// body left out -- code uses P
}
これは機能します。これを呼び出す方法は次のとおりです。
Subscribe<CurrentUserNotifications, Notification>((n) => Console.WriteLine(n));
したがって、問題は次のとおりです。次のように呼び出し可能にする方法はありますか:
Subscribe<CurrentUserNotifications>((n) => Console.WriteLine(n));
基本的に、アクション タイプはISubscriptionProvider<T>
.
このサブスクライブ メソッドは、静的クラス上にあります (これは静的メソッドであり、その部分は省略しました)。アイデアは、それを構築し、ISubscriptionProvider<T>
それをシングルトンに保つことを処理するということです (おそらく構造マップを使用)。だから使用中:
Messages.Subscribe<CurrentUserNotifications>((n) => Console.WriteLine(n));
ありがとう!
アップデート:
これはちょっと話題から外れていますが、scalaの人々がこれを読んだら...
...は、より高い種類のタイプの例ですか?何かのようなもの:
public void Subscribe<P<T>>(Action<T> callback) { }
P<_>
上位種族はどこ?