从一个通用方法传递对象,其中T:MyClass到另一个T:DerivedClass

时间:2013-03-28 17:20:36

标签: c# entity-framework inheritance polymorphism

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

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

我正在尝试向某些对象添加软删除行为;即。删除后,它们不会从数据库中删除,而是将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"

我如何得到那个布尔?

2 个答案:

答案 0 :(得分:2)

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

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
{}

答案 1 :(得分:1)

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