将对象从一个泛型方法T: MyClass传递到另一个泛型方法T: DerivedClass

本文关键字:泛型方法 MyClass DerivedClass 另一个 对象 一个 | 更新日期: 2023-09-27 18:06:15

我有一个包含这个方法的通用存储库:

public void Delete<T>(T item) where T : EntityBase

我试图添加软删除行为的一些对象;ie。删除时,它们不会从数据库中删除,而是将bool Deleted设置为false,并且在查询中停止显示,除非设置特定参数以包含它们。一般情况下,应用程序的行为就好像它们不存在一样,除了管理视图之外,这些项可以通过再次翻转bool值来恢复。我的问题是,在传递对象到这个方法,它被处理为EntityBase,它没有这种软删除行为,因为许多类不需要它。SoftDeleteEntityBase扩展EntityBase类以添加软删除行为,但我找不到一种干净的方式来转换对象,以便我可以获得bool。我的第一个想法是:

public void Delete<T>(T item) where T : EntityBase
{
    if (item is SoftDeleteEntityBase)
    {
        ((SoftDeleteEntityBase)item).Deleted = true;
        Update<T>(item);
    }
    else
    {
        db.Set<T>().Remove(item);
    }
}

但这给了我错误"Cannot convert type T to SoftDeleteEntityBase"

如何获得bool值?

将对象从一个泛型方法T: MyClass传递到另一个泛型方法T: DerivedClass

这个简短的解决方案如何,但是要考虑更改存储库的设计

SoftDeleteEntityBase itemAsSoft = item as SoftDeleteEntityBase;
if (itemAsSoft != null)
{
    itemAsSoft.Deleted = true;
    Update(itemAsSoft);
}

我不知道你的上下文,但是这个绕行泛型的解决方案如何

void Main()
{
    Delete(new Base()); // called with base
    Delete(new Derived()); //called with derived
}
public void Delete(Base item)
{
    Console.WriteLine ("called with base");
    //one logic
    GenericDelete(item);
}
public void Delete(Derived item)
{
    Console.WriteLine ("called with derived");
    //another logic
    GenericDelete(item);
}
public void GenericDelete<T>(T item)
{}
public class Base
{}
public class Derived : Base
{}

理想情况下,您应该利用多态性。EntityBase类可以有一个Delete方法;它和其他实现可以选择执行硬删除。SoftDeleteEntityBase类可以覆盖该方法,而是选择只设置Deleted字段,而不是硬删除它。这个方法不需要关心派生类型是什么;它可以直接调用Delete,让类自己选择