簡體   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