Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象泛型父类能否自动获取子(扩展)类型?_C#_Class_Generics_Inheritance - Fatal编程技术网

C# 抽象泛型父类能否自动获取子(扩展)类型?

C# 抽象泛型父类能否自动获取子(扩展)类型?,c#,class,generics,inheritance,C#,Class,Generics,Inheritance,在我的c#项目中,我有两个抽象的泛型父类,然后有多个子类继承它们。问题是我正在将子类型传递给父泛型,这会导致一些看起来很愚蠢的类和方法定义 泛型父类中是否有方法获取继承它们的类的类型?因此,与其在DTOBase中传递类型,不如声明它将是DTOBase的第一个子级的类型 父类定义 public abstract class DTOBase<T> : INotifyPropertyChanged, IMergeable<T> public abstract class Mo

在我的c#项目中,我有两个抽象的泛型父类,然后有多个子类继承它们。问题是我正在将子类型传递给父泛型,这会导致一些看起来很愚蠢的类和方法定义

泛型父类中是否有方法获取继承它们的类的类型?因此,与其在DTOBase中传递类型,不如声明它将是DTOBase的第一个子级的类型

父类定义

public abstract class DTOBase<T> : INotifyPropertyChanged, IMergeable<T>

public abstract class ModelBase<T,U> : INotifyPropertyChanged, ITrackable, IMergeable<U> 
    where T : DTOBase<T>
    where U : ModelBase<T,U>
公共抽象类DTOBase:INotifyPropertyChanged,IMergeable
公共抽象类模型库:INotifyPropertyChanged、ITrackable、IMergeable
其中T:DTOBase
其中U:ModelBase
示例子类

 public class MenuGroup : DTOBase<MenuGroup>

public class MenuGroup : ModelBase<DTOs.MenuGroup, MenuGroup>
public类菜单组:DTOBase
公共类菜单组:模型库

不,当你有一个类型关系,而这个关系很难用其他方式表达时,这种事情就相当普遍了。我的协议缓冲区端口中有类似的内容:

public interface IMessage<TMessage, TBuilder> 
    : IMessage<TMessage>, IMessageLite<TMessage, TBuilder>
    where TMessage : IMessage<TMessage, TBuilder>
    where TBuilder : IBuilder<TMessage, TBuilder>
公共接口IMessage
:IMessage,IMessageLite
where-TMessage:IMessage
制造商:IBuilder

这既烦人又丑陋,但它完成了任务。很抱歉,没有更好的消息告诉您。

为什么需要继承类的类型?在第一个示例DTOBase中,我需要IMergable接口定义的继承类的类型。Darn。这是令人沮丧的,因为我认为编译器应该能够在编译时找出这些类型关系,而不必显式地通知它。@MalcolmO'Hare:这不是编译器的问题,而是类型系统不够丰富,无法表达这种关系。