2

文字列からプロパティ セレクター ラムダを構築できる小さなメソッドを作成しました。これは、Dynamic LINQ が行うことや、スタック オーバーフローに関するその他の 100 万の例のようなものです。

たとえば、 this を指定すると、コンパイルされた場合、 this に似たExpressions.PropertySelector<Type, PropertyType>("Source.Date")が返されます。Func(Type) => type.Source.Date

とにかく、プロパティを選択するだけでなく、そのタイプで定義されたメソッドを呼び出す必要がある状況に遭遇しました。

したがって、たとえば、これと同等のものが必要です: (Type) => Type.Source.Date.ToString("Y")。メソッドを変更してPropertySelectorメソッド呼び出しを検出し、適切な式を作成できることはわかっていますが、もっと良い方法があるかどうか知りたいです。

なぜ私がこれを必要とするのか知りたい人のために: 基本的には、私が構築している Entity Framework でサポートされたリポジトリ用です。呼び出し元がラムダを渡してグループ化するプロパティを表すことができるメソッドがあります。呼び出し元自身が、ユーザー入力に基づいてラムダを構築します。したがって、この方法で行うのが最善の方法であると考えました。

しかし、たとえば、グループ化するプロパティがDateTime. そして、フォーマットされた文字列でグループ化します。

このようなシナリオを処理するための最良のアプローチは何ですか? 理想的には、式が動的に構築された後、呼び出し元に変更してもらいたいと思います。

4

1 に答える 1

2

私があなたを正しく理解していれT1T2、2 つの表現T2T3あります。これを行うには、LINQKitを使用できます。T1T3

public static Expression<Func<T1, T3>> CombineExpressions<T1, T2, T3>(
    Expression<Func<T1, T2>> first, Expression<Func<T2, T3>> second)
{
    Expression<Func<T1, T3>> result = x => second.Invoke(first.Invoke(x));
    // I think double Expand here is necessary because of Invoke inside Invoke
    return result.Expand().Expand();
}

例えば:

Expression<Func<Person, DateTime>> getDateExpression =
    person => person.DOB;
Expression<Func<DateTime, string>> dateFormatExpression =
    date => date.ToString("Y");
Expression<Func<Person, string>> result =
    CombineExpressions(getDateExpression, dateFormatExpression);

ここにresult、式が含まれています(Person x) => x.DOB.ToString("Y")

式の一方または両方を動的に作成できますが、結合の仕組みは変わりません。

于 2013-02-02T20:32:24.227 に答える