gpt4 book ai didi

C# 抽象方法强制更新方法

转载 作者:行者123 更新时间:2023-12-02 07:37:48 26 4
gpt4 key购买 nike

在我们的代码库中,我们有一个基本模型 (PersistenceEntity),它处理通过通用存储库持久存储的任何模型。这对于获取、添加和删除非常有效。我想要改进的领域是将我们的更新方法封装在存储库中,而不是在服务层中获取对象,对其进行操作(以开发人员认为合适的任何方式),然后保存它。

存储库更新方法应在内部加载模型,调用对象的更新方法,然后保存它(或调用 AddOrUpdate 扩展)。

为此,我想可以在基类上添加一个抽象方法,以强制开发人员在模型中实现更新,而不是在另一层中设置属性。

public abstract T Update<T>(T existing) where T : PersistenceEntity;

因此,这将使开发人员编写一个像这样的模型:

public class MyClass : PersistenceEntity 
{
public override MyClass Update<MyClass>(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}

但是当我以这种方式实现它时,编译器会提示,因为它认为 MyClass 是 T 的名称,而不是具体的类。我想我在这里遗漏了一些明显的东西,但我只是看不到它......任何建议将不胜感激。

最佳答案

您可以通过使 PersistenceEntity 类本身泛型来避免通过类型参数隐藏类

public abstract class PersistenceEntity<T> where T : PersistenceEntity<T>
{
public abstract T Update(T existing);
}

这意味着自引用通用约束,因为每个继承PersistenceEntity的类都应该更新其自身类型的现有实例。

MyClass 的实现如下:

public class MyClass : PersistenceEntity<MyClass>
{
public override MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}

另一个选择是创建一个不变的接口(interface),它封装了 Update 方法(如果不允许您使 PersistenceEntity 类通用)

public interface IUpdate<T> where T : PersistenceEntity
{
T Update(T existing);
}

然后实现它

public class MyClass : PersistenceEntity, IUpdate<MyClass>
{
public MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}

关于C# 抽象方法强制更新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59561723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com