0

この質問をする方法さえわからないので、コード例を示します。

ドメインは次のとおりです。

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<_>上位種族はどこ?

4

1 に答える 1

0

なぜあなたはただ使うことができないのですか

public void Subscribe<T>(Action<T> callback)
{
}

タイプPパラメータは使用されないため、シナリオには関係ありません。

于 2012-08-16T18:32:57.113 に答える