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 実装がある場合に、かみそり 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

Dメソッドから型をインスタンス化するべきではありませんColumn。代わりに、呼び出し元に渡させる必要があります。

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

あなたに欠けているものが 2 つあります。1 つはデフォルトのパラメータ設定decorator = nullで、もう 1 つは の使用です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 に答える