簡體   English   中英

C#:泛型—推斷泛型的泛型

[英]C#: Generics — Infer the Generic Type of a Generic Type

我什至不知道如何問這個問題,所以我只給出代碼示例。

這是域:

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>並將其保持為單例(可能與structuremap一起使用)。 因此在使用中:

Messages.Subscribe<CurrentUserNotifications>((n) => Console.WriteLine(n));

謝謝!

更新:

這有點題外話,但是如果有斯卡拉人讀過這個……

...是更高種類的例子嗎? 就像是:

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

其中P<_>是較高種類的類型?

你為什么不能只用

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

在您的方案中,類型P參數無關緊要,因為它從未使用過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM