【发布时间】:2013-08-02 20:06:20
【问题描述】:
如何创建具有可选泛型类型的泛型方法?这就是我现在所拥有的,它有效
public GridViewColumn<T> Column<D>(String HeaderText, D decorator) where D: IColumnDecorator, new()
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
column.Decorator = new D();
return column;
}
如您所见,我需要在 Column() 方法中实例化类型 D(实现 IColumnDecorator)。
问题是,“D”类型是可选的。如果为 Null,我想明确使用我拥有的默认 ColumnDecorator。像
public GridViewColumn<T> Column<D>(String HeaderText, D decorator) where D: IColumnDecorator, new()
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
if(decorator ==null)
{
column.Decorator = new DefaultColumnDecorator();
}
else{
column.Decorator = new D();
}
return column;
}
请帮忙。谢谢!
[编辑]。
如果我有一个自定义的 IColumnDecorator 实现,我想在 razor MVC 中使用它
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column<MyOwnColumnDecorator>("FirstColumn")
)
});
如果我没有任何并想使用默认值,那么我希望能够做类似的事情
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column("FirstColumn",null) or simply grid.Column("FirstColumn");
)
});
【问题讨论】:
-
为什么你的第一个方法让调用者传入
D的实例?你从不使用它。 -
为什么需要在
Column()中实例化类型D?让调用者传入实例会更加灵活。 -
贾斯汀,你是什么意思?还有玉修,我这样做是因为我不希望我的调用者在调用时必须指定具体类型的“新”关键字。
-
如果你想要一个默认的 ColumnDecorator,只需进行重载。有一个非泛型重载 - 它使用你的 columndecorator。为泛型提供(非空)默认值是没有意义的……这更符合接口参数。
-
你不能这样使用它。您在此调用中硬编码装饰器的类型,当您尝试实例化 DefaultDecorator 时,您的代码将无法编译,因为您的方法需要 MyOwnColumnDecorator 类型。我不知道我是否解释过自己。