C# 泛型方法参数

C# Generic method param

我正在尝试创建一个简单的服务,其中派生的 classes 可以通过传入自己的对象来覆盖虚拟方法。似乎无法正确使用语法。请看下面的代码:

所以基数class如下:

public class FooBase
{
    public virtual Task StartFooAsync<TParam>(TParam param) where TParam : IFooParam
    {
        Console.WriteLine(param.GetType());
        return Task.CompletedTask;
    }
}

IFooParam界面:

public interface IFooParam
{
    public string Title { get; set; }
}

实现这个简单接口的class是:

public class FooParam : IFooParam
{
    public string Title { get; set; }
}

现在,当我尝试继承 FooBase class 时:

public class FooOne : FooBase
{
   public override Task StartFooAsync(FooParam param) // wont compile :(
   {
       return base.StartFooAsync(param);
   }
}

我收到编译时错误,告诉我没有合适的方法可以覆盖 StartFooAsync

这里的目标是从 FooBase class 继承并提供自己的实现,其首选类型作为 StartFooAsync

的参数

不,如果虚方法是泛型方法,覆盖也必须是泛型方法。泛型方法允许 调用者 指定类型参数。

以下是您的代码为何无法运行的示例...这应该是完全有效的:

class OtherParam : IFooParam
{
    public string Title { get; set; }
}

FooBase x = new FooOne(); // FooOne derives from FooBase
var p = new OtherParam { Title = "xyz" };
x.StartFooAsync<OtherParam>(p);

FooBase 的声明中没有任何内容会阻止编译...但是您还没有提供可以处理 OtherParamStartFooAsync 的实现。

另一种方法是使 FooBase 通用:

public class FooBase<TParam> where TParam : IFooParam
{
    public virtual Task StartFooAsync(TParam param)
    {
        ...
    }
}

那么您的 FooOne 将派生自 FooBase<FooParam>。这将防止我之前展示的损坏代码,因为 x 将被声明为 FooBase<FooParam>FooOne,而 StartFooAsync 方法将 only接受FooParam.