gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:36 25 4
gpt4 key购买 nike

我有一个接口(interface)

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

这有不同的具体实现。我正在尝试开发一项服务,让开发人员注册 IOfflineBackedRepo 接口(interface)的不同实现,并在以后的某个时间点单独调用 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

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
}
}

关于c#通用接口(interface),其中参数是通用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52510062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com