首页 > 解决方案 > c# 泛型接口,其中参数是泛型的

问题描述

我有一个界面

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
}

如何解决语法问题?

标签: c#generics

解决方案


ISyncManagerTSummary,TDetail在其范围内没有任何提及

TSummary并且TDetail仅在 周围定义和存在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
    }
}

推荐阅读