2

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

 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"); 
          )
    });
4

6 回答 6

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;
}

如果您有要使用的默认参数类型,则不需要使用泛型:

public GridViewColumn<DefaultColumnDecorator> Column(String headerText)
{
    return Column<DefaultColumnDecorator>(headerText);
}

或者,您可以保留参数并删除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());
}
于 2013-08-02T20:11:54.137 回答
1

使用默认参数:

public GridViewColumn<T> Column<D,T>(string HeaderText, D decorator = null)
    where D : IColumnDecorator, class, new()
于 2013-08-02T20:11:38.097 回答
1

您不应该DColumn方法中实例化类型。相反,您应该让调用者将其传入。

 public GridViewColumn<T> Column(String HeaderText, IColumnDecorator decorator) 
        {
            GridViewColumn<T> column = new GridViewColumn<T>();
            column.HeaderText = HeaderText;
            if(decorator ==null)
            {
               column.Decorator = new DefaultColumnDecorator();
            }
            else{
               column.Decorator = decorator;
            }
            return column;
        }

理由在这里:http ://en.wikipedia.org/wiki/Dependency_injection

于 2013-08-02T20:16:05.617 回答
0

在玩了一些选项后,我制作了一个适用于以下代码的示例:

public GridViewColumn<TResult> Column<TColumn>(string HeaderText, TColumn decorator = null) where TColumn : class, IColumnDecorator
{
    GridViewColumn<TResult> column = new GridViewColumn<TResult>();
    column.HeaderText = HeaderText;

     if(decorator == null)
     {
        column.Decorator = new DefaultColumnDecorator();
     }
     else
     {
        column.Decorator = decorator;  
     }     

    return column;
}

为了完成这项工作,您需要考虑以下事项:

  • 您需要添加类限制才能将参数定义为空。
  • 您不应使用default(TColumn),因为由于类限制,它将返回 null 。
  • 出于某种原因,如果您使用“?:”语法,编译器不接受您实例化 DefaultColumnDecorator 类型,但如果您使用常规 if 语句,它可以工作。
  • 似乎 new() 限制对于此工作不是必需的。

在我的示例中,我可以通过以下两种方式调用此方法,结果相同:

@Model.[IEnumerable].Grid(grid=>{
      ..
      ...
      grid.columns(
         grid.Column<MyOwnColumnDecorator>("FirstColumn",null);
      )
});

@Model.[IEnumerable].Grid(grid=>{
      ..
      ...
      grid.columns(
         grid.Column<MyOwnColumnDecorator>("FirstColumn");
      )
});

祝你好运!

于 2013-08-02T20:38:32.463 回答
0

有很多方法可以做你想做的事,让调用者通过一种方法来制作装饰器怎么样?

public GridViewColumn<T> Column(string HeaderText, Func<IColumnDecorator> decoratorGenerator)
{
  GridViewColumn<T> column = new GridViewColumn<T>();
  column.HeaderText = HeaderText;
  column.Decorator = decoratorGenerator != null ? decoratorGenerator()
    : new DefaultColumnDecorator() ;
  return column;
}
于 2013-08-03T00:56:14.243 回答
-1

我看到你缺少两件事。一种是默认参数设置decorator = null,另一种是使用default(T). 我已将您的改写如下,但显然我无法对其进行测试-尽管应该很接近。

public GridViewColumn<TResult> Column<TColumn>(string HeaderText, TColumn decorator = null) where TColumn : IColumnDecorator, new()
{
    GridViewColumn<TResult> column = new GridViewColumn<TResult>();
    column.HeaderText = HeaderText;
    column.Decorator = decorator == null ? new DefaultColumnDecorator() : default(TColumn);

    return column;
}
于 2013-08-02T20:30:54.830 回答