1

このコードを考えると:

public class PaginationModel<T> : BaseModel
{
    public List<T> Rows { get; set; }

    public PagingInfo PagingInfo { get; set; }

    public void AddColumn<TProp>(Expression<Func<T, TProp>> column)
    {

    }
}

コードを使えるようにしたい

leadListOutputModel.AddColumn(x => x.DateCreated);

次に、MVCビューで列のコレクションをループし、オブジェクトに対して式を呼び出します。ただし、TPropはメソッド呼び出しで推測されるため、汎用フィールドとして格納されているようには見えません。

    private List<Expression<Func<T, TProp>>> columns = new List<Expression<Func<T, TProp>>>();

オブジェクトを使用したり、一般的な利点を失うことなく、これを回避する方法を誰かが考えることができますか?

- - 編集

私は2つのことをしようとしています、

まず、「SortBy」パラメーターをコントローラーに渡します。このパラメーターは、現在((MemberExpression)expression).Member.Nameを介して抽出されている、文字列のプロパティの名前を取ります。次に、私のMVCビューでそのフィールドの値を抽出するFunc。

その理由は、私が与えたAddColumnの例のように、コントローラーで優れた構文を使用して構成可能な列を持つようにしたいページ化されたグリッドを作成しているためです。列を調べてヘッダー行を作成し、モデルのコレクションでそれらをループして、それらに対してFuncを呼び出して値を引き出したいと思います。

4

2 に答える 2

2

その後、列でをしようとしていますか? 呼び出しごとに異なる可能性があるため、結果の型に関するコンパイル時の情報を後で実際に使用することはできません。

AddColumn(x => x.SomeInt32Value);
AddColumn(x => x.SomeDateTimeValue);

それらを同じコレクションに格納する場合は、とにかくキャストするか、より一般的な形式を使用する必要があります

以下の使用を検討してください。

public void AddColumn(Expression<Func<T, object>> column)

「ソース」タイプに関してはまだ安全です...「結果」タイプは失われますが、とにかく役に立たないと思います。

于 2012-07-31T13:36:08.733 に答える
0

各インスタンスが異なる を持つコレクションを作成しようとしているようですTProp
それは直接には不可能です。

代わりに、非ジェネリック インターフェイスを実装するジェネリック クラスを作成できます。
その後、非ジェネリック インターフェイスのコレクションを作成し、ジェネリック メソッドからジェネリック クラスのインスタンスをコレクションに追加できます。

この手法の例については、私のExcelExporter ライブラリとその汎用SheetBase クラスを参照してください。

于 2012-07-31T13:35:17.013 に答える