C# 使用泛型将类型信息传递给超类

C# 使用泛型将类型信息传递给超类,c#,generics,C#,Generics,我写的代码有一个超类,它封装了一个特定的对象,每个特定的子类(例如下面的例子)都是子类类型与其封装的类类型之间的关系示例。所有封装类也对它们封装的类进行隐式转换。(非抽象的) 我觉得我可以使用泛型来获得类型安全性和优雅性,而不是使用非类型安全的对象类型 public abstract class Entity<T> where T: class { protected T DataObject; } public class Item : Entity<Model.I

我写的代码有一个超类,它封装了一个特定的对象,每个特定的子类(例如下面的例子)都是子类类型与其封装的类类型之间的关系示例。所有封装类也对它们封装的类进行隐式转换。(非抽象的)

我觉得我可以使用泛型来获得类型安全性和优雅性,而不是使用非类型安全的
对象
类型

public abstract class Entity<T> where T: class
{
    protected T DataObject;
}

public class Item : Entity<Model.Item>
{
    // Can use this.DataObject and it is type Model.Item
}

public class Box : Entity<Model.Box>
{
    // Can use this.DataObject and it is type Model.Box
}
这对我来说有两个主要问题,一个是当我想引用一个二级对象作为抽象类时,我必须把它放在
项中,我想有一种方法使它隐式,因为在任何情况下这都是不正确的。它还破坏了我对抽象类的隐式转换,因为它们无法实例化

没有什么是行不通的,我基本上想删除遗传参数,同时仍然保持有一个特定类型的封装对象的能力。封装的对象实际上是一个Linq-to-SQL对象,周围的对象正在形成一种用于更改的缓冲区,同时实现其他功能,并提供应用程序中数据的更直接表示。我需要保留LinqToSql实体,这样我就可以继续使用LinqToSql更新更改和管理插入/删除,而无需重新发明轮子。我使用了分部类来实现这一点,但是与属于不同DataContext的对象有太多的混淆

编辑:完整故事

我有一个由不同类型的调查对象组成的调查评估。某些测量对象(如“实际问题”对象)由不同的其他对象组成。例如,块是具有项目库的测量对象,项目库由多种不同类型的项目组成(当前表示为子类)。到目前为止,我一直直接使用LINQtoSQL实体作为我的模型,并通过部分类进行了一些更改。项目的脚本在调查中调用项目前后执行。此脚本可以更改项的某些属性,但由于我的linq类是我的模型,因此每当我根据linq的性质对它们进行更改时,它都希望将这些更改持久化到数据库中

有人看到更好的做事方式吗

见。您可能能够在T:class{T DataObject{get;}}
中创建一个
接口,并使抽象类实现这一点,然后您可以隐式地进行这种转换:

IEntity<Model.AItem> a = //something
IEntity<Model.Item> b = a; //it works!
IEntity a=//什么
密度b=a//它起作用了!

如果你不能使用协变接口,那么你就不能在逻辑上做你想做的事情,您应该尝试从其他角度找出解决方案。

您能澄清什么不适合您吗?基类对子类的类型信息做了什么?您能举例说明您不喜欢什么吗?我不确定你所说的“当我想引用一个二级对象作为抽象类时,我必须把它放在那个项目中,我想有一种方法使它隐式化”是什么意思。听起来你想拥有一个泛型类,但让它神奇地决定泛型参数的类型。哈哈,不,你是对的,我认为使用Tim的协方差会起作用,我会让我所有的类实现它们特定类的接口,然后让我像正常一样构建继承树
public class Item<T> : Entity<T> where T : Model.Item
{
    // Can use this.DataObject and it is type Model.Item
}

public class AItem : Item<Model.AItem>
{
    // Can use this.DataObject and it is type Model.AItem
}
IEntity<Model.AItem> a = //something
IEntity<Model.Item> b = a; //it works!