具有可选通用参数的通用方法 [英] Generic Method with optional generic parameter
问题描述
如何使用可选的泛型类型创建泛型方法?这就是我现在所拥有的,它可以工作
public GridViewColumn< T> Column< D>(String HeaderText,D decorator)其中D:IColumnDecorator,new()
{
GridViewColumn< T> column = new GridViewColumn< T>();
column.HeaderText = HeaderText;
column.Decorator = new D();
返回列;
$ b 正如你所看到的,我需要实例化类型D(实现IColumnDecorator)在Column()方法中。
问题是,类型D是可选的。如果为空,我想明确地使用我拥有的默认ColumnDecorator。类似于
public GridViewColumn< T> Column< D>(String HeaderText,D decorator)其中D:IColumnDecorator,new()
{
GridViewColumn< T> column = new GridViewColumn< T>();
column.HeaderText = HeaderText;
if(decorator == null)
{
column.Decorator = new DefaultColumnDecorator();
}
else {
column.Decorator = new D();
}
返回列;
}
请帮忙。谢谢!
。
如果我有一个自定义的IColumnDecorator实现,我想如何在剃刀MVC中使用它
@Model。[IEnumerable] .Grid(grid => {
..
...
grid.columns(
grid.Column< MyOwnColumnDecorator>(FirstColumn)
)
});
如果我没有任何要使用的默认值,那么我希望能够做到类似于
@Model。[IEnumerable] .Grid(grid => {
..
...
grid.columns(
grid.Column(FirstColumn,null)或者只是grid.Column(FirstColumn);
)
});
解决方案在您当前的代码中,您不需要 decorator
参数,因为您创建了 D
的新实例并使用它。
public GridViewColumn< T> Column< D>(String HeaderText)其中D:IColumnDecorator,new()
{
GridViewColumn< T> column = new GridViewColumn< T>();
column.HeaderText = HeaderText;
column.Decorator = new D();
返回列;
$ b $ p
$ b 如果你有一个默认的参数类型可供使用,你不需要使用泛型:
public GridViewColumn< DefaultColumnDecorator> Column(String headerText)
{
return Column< DefaultColumnDecorator>(headerText);
}
另外,您可以保留参数并删除 new ()
约束:
public GridViewColumn< T> Column< D>(String HeaderText,D装饰器)其中D:IColumnDecorator
{
GridViewColumn< T> column = new GridViewColumn< T>();
column.HeaderText = HeaderText;
column.Decorator =装饰者;
返回列;
}
public GridViewColumn< DefaultColumnDecorator> Column(String headerText)
{
return Column(headerText,new DefaultColumnDecorator());
}
How do I create a generic method with an optional generic type? This is what I have right now, which works
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;
}
As you can see, I need to instantiate the type D (implements IColumnDecorator) inside the Column() method.
The issue is, the type "D" is optional. If Null, I want to explicitly use a default ColumnDecorator that I have. something like
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;
}
Please help. Thanks!
[Edit].
Here is how I want to use it in razor MVC if I have a custom IColumnDecorator implementation
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column<MyOwnColumnDecorator>("FirstColumn")
)
});
If I don't have any and want to use default, then I want to be able to do something like
@Model.[IEnumerable].Grid(grid=>{
..
...
grid.columns(
grid.Column("FirstColumn",null) or simply grid.Column("FirstColumn");
)
});
解决方案 In your current code, you don't need the decorator
parameter since you create a new instance of D
and use that instead.
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;
}
If you have a default parameter type to use, you don't need to use generics:
public GridViewColumn<DefaultColumnDecorator> Column(String headerText)
{
return Column<DefaultColumnDecorator>(headerText);
}
Alternatively you could keep the parameter and remove the new()
constraint:
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());
}
这篇关于具有可选通用参数的通用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!