具有可选通用参数的通用方法 [英] Generic Method with optional generic parameter

查看:102
本文介绍了具有可选通用参数的通用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用可选的泛型类型创建泛型方法?这就是我现在所拥有的,它可以工作

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆