c#通用接口,其中参数是通用的

时间:2018-09-26 04:41:14

标签: c# generics

我有一个界面

public interface IOfflineBackedRepo<TSummary,TDetail>
{
    Task SyncAsync();
}

这具有不同的具体实现。我正在尝试开发一项服务,使开发人员可以注册IOfflineBackedRepo接口的不同实现,并在以后的某个时间分别调用SyncAsync。新接口应该与下面的类似,除了这不是有效的语法。

public interface ISyncManager<T> where T : IOfflineBackedRepo<TSummary, TDetail>
{
    void Register(T repo);

    Task SyncNowAsync(); // this loops through and calls SyncAsync on the repo
}

如何解决语法问题?

1 个答案:

答案 0 :(得分:1)

ISyncManager在其范围内没有任何地方提到TSummary,TDetail

TSummaryTDetail被定义并且仅在IOfflineBackedRepo周围存在。当您尝试在其他任何地方使用它时,必须定义一种类型来替代它们。它可以是实际类型,也可以是您从通用参数中获得的类型,但必须在ISyncManager

周围定义它

最基本的方法,

public interface ISyncManager<T,U,V> where T : IOfflineBackedRepo<U,V>
{
    void Register(T repo);

    Task SyncNowAsync(); // this loops through and calls SyncAsync on the repo
}

为便于使用,我认为您应该仅使用单独的界面

public interface IOfflineBackedRepo
{
    Task SyncAsync(); // this function is not typed specific right?
}

public interface IOfflineBackedRepo<TSummary,TDetail> : IOfflineBackedRepo
{
    // other definition about type specific
}

public interface ISyncManager<T> where T : IOfflineBackedRepo
{
    void Register(T repo);

    Task SyncNowAsync(); // this loops through and calls SyncAsync on the repo
}

我想ISyncManager实际上只是一个集合。我认为最好只做扩展的收集方法

public static class SyncManagerExt
{
    // Register is just Add to collection
    public static Task SyncNowAsync(this ICollection<T> items) where T : IOfflineBackedRepo
    {
        // loops through items and calls SyncAsync on the repo
    }
}