如何使用可选的泛型类型创建泛型方法?这就是我现在所拥有的,这是有效的
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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要在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;
}
Run Code Online (Sandbox Code Playgroud)
请帮忙.谢谢!
[编辑].
如果我有一个自定义的IColumnDecorator实现,我想在razor MVC中使用它
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column<MyOwnColumnDecorator>("FirstColumn")
)
});
Run Code Online (Sandbox Code Playgroud)
如果我没有任何想要使用默认值,那么我希望能够做类似的事情
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column("FirstColumn",null) or simply grid.Column("FirstColumn");
)
});
Run Code Online (Sandbox Code Playgroud)
在当前代码中,您不需要decorator参数,因为您创建了一个新实例D并使用该实例.
public GridViewColumn<T> Column<D>(String HeaderText) where D: IColumnDecorator, new()
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
column.Decorator = new D();
return column;
}
Run Code Online (Sandbox Code Playgroud)
如果您要使用默认参数类型,则不需要使用泛型:
public GridViewColumn<DefaultColumnDecorator> Column(String headerText)
{
return Column<DefaultColumnDecorator>(headerText);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以保留参数并删除new()约束:
public GridViewColumn<T> Column<D>(String HeaderText, D decorator) where D : IColumnDecorator
{
GridViewColumn<T> column = new GridViewColumn<T>();
column.HeaderText = HeaderText;
column.Decorator = decorator;
return column;
}
public GridViewColumn<DefaultColumnDecorator> Column(String headerText)
{
return Column(headerText, new DefaultColumnDecorator());
}
Run Code Online (Sandbox Code Playgroud)