【问题标题】:Problem with subclass parameter 'no suitable method found to override'子类参数的问题“找不到合适的方法来覆盖”
【发布时间】:2020-06-26 08:31:45
【问题描述】:

我有一个具有以下方法的 DataSourcesController:

public abstract ActionResult<IEnumerable<DataSource>> Add(DataSourceDTO dataSourceDTO);
public abstract ActionResult<IEnumerable<DataSource>> Edit(DataSourceDTO dataSourceDTO);

我有一个覆盖这些方法的 SQLDataSourcesController:

[HttpPost]
public override ActionResult<IEnumerable<DataSource>> Add(SQLDataSourceDTO sqlDataSourceDTO)
{ //code is in here }

[HttpPut]
public override ActionResult<IEnumerable<DataSource>> Edit(SQLDataSourceDTO sqlDataSourceDTO)
{ //code is in here }

但是,由于 SQLDataSourceDTO 而不是 DataSourceDTO,我收到以下错误: SQLDataSourcesController.Add(SQLDataSourceDTO': no suitable method found to override SQLDataSourcesController.Edit(SQLDataSourceDTO': no suitable method found to override

My SQLDataSourceDTO 是 DataSourceDTO 的子类:

public abstract class DataSourceDTO
{ //code is in here }
public class SQLDataSourceDTO : DataSourceDTO
{ //code is in here }

感谢任何有关如何解决此问题的帮助!

【问题讨论】:

  • 您如何使用控制器?你在哪里得到这个错误?请分享剩下的代码
  • @PavelAnikhouski 控制器是 APIControllers。我在控制器类中得到错误。但是,如果我将该参数类型更改为 DataSource 而不是 SQLDataSource 错误就会消失,但我认为我写的内容应该可以工作,因为我传入了它期望的基类的子类..

标签: c# .net inheritance subclass superclass


【解决方案1】:

您不能使用派生类型作为参数覆盖该方法,因为签名不匹配。对于覆盖,签名应该完全匹配。

但您可以改用泛型类型。

public class Base
{
    public int Id
    {
        get;
        set;
    }
}

public class Derived : Base
{
    public string Name
    {
        get;
        set;
    }
}

public class Controller<T> where T : Base, new()
{
    public virtual void Compute(T b)
    {
    }
}

public class SqlController : Controller<Derived>
{
    public override void Compute(Derived b)
    {
    }
}

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多