[英]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.