首页 > 解决方案 > 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>. 但我不想那样做。

有没有其他方法可以实现它。

标签: c#genericsinheritanceabstraction

解决方案


推荐阅读