2013-05-29 81 views
4

我有一個抽象類CommandBase<T, X>,我想要一個屬性InnerCommand具有不同實現的泛型基類中的屬性

但是由於InnerCommand可能具有其他類型的T和X,而不是包含它的命令,我該如何定義它?

抽象類:

public abstract class CommandBase<T, X> 
    where T : CommandResultBase 
    where X : CommandBase<T, X> 
{ 
    public CommandBase<T, X> InnerCommand { get; set; } 
    (...) 
} 

在上面InnerCommand的例子將只接受具有相同類型T和X的情況下,但我需要允許其他類型。

的AddOrderitemCommand:

public class AddOrderitemCommand : CommandBase<AddOrderitemResult, AddOrderitemCommand> 
{ 
    (...) 
} 

可能包含WebserviceCommand:

public class GetMenuCommand : CommandBase<GetMenuResult,GetMenuCommand> 
{ 
    (...) 
} 

請在語法建議允許這一點。

回答

6

你基本上有三種選擇:

  1. 使用dynamic爲屬性的類型。沒有我會做的。
  2. 使用object作爲該屬性的類型。沒有我會做的。
  3. 爲命令創建非通用基類或接口。使CommandBase<T, X>實現它並將其用作屬性的類型。這就是我會走的路。
+1

3罰款;我認爲1&2使得API *開放 - 你可以分配'「一些字符串」,例如 - 加上從期望的簽名中不明顯它會怎麼樣 –

+0

@MarcGravell:我同意。這就是爲什麼我不會使用它們。但它仍然是一種可能性,所以我想提一提。可能有一些非常有限的場景,它們可能有用。 –

5

如果InnerCommand不涉及母公司T/X,那麼我會建議使用非通用InnerCommand不做廣告簽名中的類型。這可能意味着要添加一個非泛型基類型(CommandBase)或一個接口(ICommandBase)。然後,你可以簡單地使用:

public ICommandBase InnerCommand {get;set;} 
// note : CommandBase<T,X> : ICommandBase 

public CommandBase InnerCommand {get;set;} 
// note : CommandBase<T,X> : CommandBase 
相關問題