2011-10-17 42 views
2

在我的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> 

舉例子類

public class MenuGroup : DTOBase<MenuGroup> 

public class MenuGroup : ModelBase<DTOs.MenuGroup, MenuGroup> 
+0

爲什麼你需要繼承類的類型? – svick

+0

在第一個示例DTOBase中,我需要IMergeable接口定義的繼承類的類型。 –

回答

3

不,那種事是相當常見。我在協議緩衝區端口有類似的東西:

public interface IMessage<TMessage, TBuilder> 
    : IMessage<TMessage>, IMessageLite<TMessage, TBuilder> 
    where TMessage : IMessage<TMessage, TBuilder> 
    where TBuilder : IBuilder<TMessage, TBuilder> 

這是討厭和醜陋的,但它完成工作。對不起,沒有更好的消息給你。

+0

織補。這令人沮喪,因爲我認爲編譯器應該能夠在編譯時找出這些類型關係,而不必明確告知它。 –

+0

@ MalcolmO'Hare:這不是一個*編譯器*的問題 - 這是類型系統不足以表達關係。 –