带有可选通用参数的通用方法

Lim*_*ing 2 c# generics

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

 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)

Lee*_*Lee 6

在当前代码中,您不需要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)