Please do not focus on the poor overall design我正在处理一个C#、EF驱动的API,在该API中,原始程序员同步地编写所有程序,这导致了极低的性能.我将所有内容都转换为异步1:1,这就产生了一些设计模式问题.

其中一个问题是所有映射器类都直接从一个接口继承,类似于:

Interface IConvertThings<T,S>()
{
   public Task<T> ConvertTo(S object);
   public Task<T> ConvertFrom(T object);
}

我们已经面临的一个问题是,我们有多个代码重复,其中一个没有值(即您可以ConvertTo,但不能ConvertFrom,反之亦然).为了解决这个问题,我为要继承的所有其他对象创建了一个抽象类:

public abstract class AConvertThings<T,S> : IConvertThings<T,S>
{
  public Task<T> ConvertTo(S object) { throw new NotImplementedException(); }
  public Task<S> ConvertFrom(T object) { throw new NotImplementedException(); }
}

所有转换类现在都继承自AConvertThings.其目的是,如果一个方法没有在转换类中定义(用"new"来隐藏原始方法),我们将调用AConvertThings方法并报告错误,并让开发人员知道他们在该Converter上调用了一个不完整的方法(因为有些方法应该是单向的).

我遇到的问题是,即使继承类上的关键字为new,AConvertThings类也会在运行时被调用,当继承类具有完全完整的堆栈时会抛出错误.

public async new Task<TYPE> ConvertTo(OTHERTYPE object)我忽略了什么?

推荐答案

如果我理解正确的话,您希望在支持转换的派生类中使用overrideConvertToConvertFrom方法.

使用new关键字是not覆盖任何方法,它只是显式地使用hiding(隐藏)它们.有关成员重写和隐藏之间的行为差异的解释,请参见此处:Overloading,Overriding and Hiding?

若要使ConvertToConvertFrom可重写,请在AConvertThings基类中的方法上使用virtual关键字.然后,任何希望重写这两个方法中的一个或两个的派生类都将使用关键字override.(https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/virtual)

Csharp相关问答推荐

火鸟DBC驱动程序未加载ADF DLC

如何将两个查询结果组合在C#ASP.NET MHC控制器中

.NET通过版本自动增量设置包版本

我可以 suppress 规则CS 9035一次吗?

需要深入了解NpgSQL DateTimeOffset处理

哪个nuget包含SecurityStampValidatorOptions

此反射有什么问题.是否发送值转换委托?

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

NET8 Maui&;iOS:AppCenter崩溃错误

如何在C#中转换泛型包装类内部的派生类

有没有类似于扩展元素的合并元组的语法?

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

LINQ to Entities中的加权平均值

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

Blazor:搜索框在第一次搜索时不搜索

EF Core:如何对关系属性进行建模?

如何在Polly重试策略成功之前将HttpClient请求排队?

如何将 colored颜色 转换为KnownColor名称?

在C#中通过Matheval使用自定义公式

游戏对象走向不同的方向