c# - C# 将多个通用参数转换为单个具体类型
问题描述
我很少坚持使用多个通用参数来实现某些东西。我有一个服务接口,它将一个消息上下文接口作为方法的输入。
public interface IService<T,U> where T : IMessageContext<U>
{
void ExecuteJob(T data);
bool CancelJob();
}
然后是一个实现接口的抽象类。
public abstract class AbstractService<T,U> : IService<T,U> where T: IMessageContext<U>
{
public virtual bool CancelJob()
{
return true;
}
public abstract void ExecuteJob(T data);
}
IMessage
接口和默认实现如下图
public interface IMessageContext<U>
{
U Data { get; set; }
}
public class DefaultMessageContext : IMessageContext<string>
{
public string Data { get ; set; }
}
在这种情况下,如果我们继承AbstractService
类,它会像下面这样,带有 T as DefaultMessageContext
& U as的通用参数string
public class ConcereteService : AbstractService<DefaultMessageContext,string>
{
public override void ExecuteJob(DefaultMessageContext data)
{
//Execute the job
}
}
有没有一种方法可以让我只提到 TDefaultMessageContext
的类型,因为 U 的类型在实现时已经在类中设置IMessageContext
像这样的东西
public class ConcereteService : AbstractNewService<DefaultMessageContext>
{
public override void ExecuteJob(DefaultMessageContext data)
{
//Execute the job
}
}
我可以引入另一层抽象,其中 U 的类型设置为字符串,并且只保持 T 开放以实现AbstractStringService<T> : AbstractService<T,string>
. 但我不想那样做。
有没有其他方法可以实现它。
解决方案
推荐阅读
- lambda - Mapcar and Lambda, an undeclared variable error in LISP
- python-3.x - 为什么此代码返回 TypeError: unsupported operand type(s) for +: 'float' and 'str'?
- javascript - 如何在 html 下拉列表中将类名更改为我的选择?
- amazon-web-services - 在 Elasticsearch 上安装 repository-se 插件
- python - 多个midi节目同时播放?
- css - 如何拥有具有固定纵横比和最大高度的 DIV?(纯 CSS/无 vh 或 vw)
- phpspreadsheet - 如何在不修剪的情况下获取所有工作表名称?
- r - 行作为系列情节 R
- php - 如果项目在 laravel 中有 PDF,则显示链接
- python - 从 Selenium + Python 获取文本