2013-05-29 49 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 
相关问题