繁体   English   中英

具有泛型类型的C#继承似乎正在创建其他对象类型

[英]C# Inheritance with a generic type appears to be creating a different object type

我有一个用于实体框架的抽象类。 然后,我继承该类并在需要时重写。 在这种情况下,我有一个要删除的帖子,我想删除与该帖子相关的评论。 逻辑很简单,但是我似乎遇到了奇怪的类类型问题。

这是我所期望的。 但是, entity.ID不存在。 实际上,实体对象根本没有属性(就Visual Studio intellisense而言)。 我试图对其进行强制转换,并说它不能将Post强制转换为MyProject.Models.Post,即使它应该是完全相同的类也是如此。 因此,似乎通过使用泛型类型并将其在继承期间进行强制转换,可以创建一个同名的新类。

public abstract class MyAbstractService<T>
{
    public virtual void Delete<T>(T entity)
    {
        this.context.Set<T>().Remove(entity);
    }
}

public abstract class MyAbstractService :AbstractService<Post>
{
    public override void Delete<Post>(Post entity)
    {

        this.context.PostComments.RemoveRange(this.context.PostComments.Where(x => x.Post.ID == entity.ID));
        base.Delete(entity);
    }
}

我可以使用下面的方法解决这种类型的问题,但是我不明白为什么会首先发生这种情况。 我假设有比我在这里使用的铸造方法更好的处理方法。 如果没有其他选择,那么首先使这种情况发生的是什么?

public override void Delete<Post>(Post entity)
{
    MyProject.Models.Post pst = entity as MyProject.Models.Post;
    this.context.PostComments.RemoveRange(this.context.PostComments.Where(x => x.Post.ID == pst.ID));
    base.Delete(entity);
}

根据评论,似乎这样的东西是实现删除的一种更可取的方式,但是我仍然觉得抽象方法很有用,因为我已经将它用于许多其他没有关系的实体。

public void Delete(Post entity)
{
    this.context.PostComments.RemoveRange(this.context.PostComments.Where(x => x.Post.ID == entity.ID));
    base.Delete(entity);
}

您在MyAbstractService上的Delete方法正在定义一个方法,该方法表示任何MyAbstractService都可以删除任何类型的任何对象。

因此,当您从该抽象类继承并提供该方法的实现时,您需要提供一种能够删除任何类型的任何对象的方法。 您已经在实现中将您的通用类型命名为Post (可以随意调用它),但是调用该通用参数Post并不意味着实例的类型为Post ,而这只是您通用类型的名称,因此对象可以是任何类型 如果要将对象视为Post类型,则需要像执行操作一样将其强制转换。

现在你有一个的签名声称它可以接受任何类型的对象的方法,但在现实中,如果它不是类型的对象,它只会失败Post 那是不好的设计; 您的API对调用者说谎。

取而代之的是, MyAbstractService类型具有可以删除任何类型的对象的方法是没有意义的。 Delete不应该是通用的。 相反,它应该只使用泛型类的 ,而不是限定了第二泛型类型(这也叫T ,容易混淆不够)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM