c# - 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
}
如何解决语法问题?
解决方案
ISyncManager
TSummary,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
}
}
推荐阅读
- odoo - 为什么我们需要“custom_addins 目录”来自定义模块?
- python - 在 pandas 中快速有效地用历史平均值填充缺失数据
- excel - 是什么导致我的类型不匹配,我该如何解决
- android - 在 kotlin 和 android 中是否有类似于 rxjs 或 rxjava 中的 switchmap 的东西?
- java - 从 JTextArea 将文本存储为数组列表
- visual-studio-code - 我可以使用 Visual Studio Code PowerShell 扩展调试 ActiveDirectory 吗?
- powershell - PowerShell 获取服务问题
- r - 尝试安装与 R 版本相关的软件包时出错
- android - 如何在 Android ViewModel 中等待多个作业?
- python - python中'@'的用法是什么?