0

私は変換しようとしています:

Expression<Func<TProperty>>

Func<TObject, TProperty>

TObjectが既知であり、式によって表現されるプロパティを公開する場合。このためには、式を操作し、それを新しい式のTObject型パラメーターと組み合わせて、コンパイルする必要があると思います。

編集:入力と出力の例

class SomeType
{
   public int Number { get; set; }

   public Func<TObject, TProperty> FuncConverter<TObject, TProperty>(Expression<Func<TProperty>>)
   {
       // ???      
   }

   public void test()
   {
       Func<SomeType, int> outputFunc = FuncConverter<SomeType, int>(inputExpression);
   }
}

入力として期待する式:

Expression<Func<int>> inputExpression = () => Number;

この式は、SomeTypeのNumberプロパティを指します

出力として期待するFuncデリゲート:

Func<SomeType, int> outputFunc = type => type.Number;

編集終了

問題は、それをどうやってやるのかわからないということです。まだ出会っていないので、ラムダ式の操作に関するいくつかの(参照)アクセス可能な情報を本当に感謝します。

4

1 に答える 1

0

私は私の質問に対する答えを見つけました:

Func<TObject, TProp> Converter<TObject, TProp>(Expression<Func<TProp>> propertyExpression )
    {
        MemberExpression member = propertyExpression.Body as MemberExpression;

        // Get the Property information of the propertyExpression memberExpression
        var property = member.Member as PropertyInfo;

        // Get the Declaring type information from member expression (equivalent to TObject)
        var type = member.Member.DeclaringType;

        // Define the source Parameter for the new Func delegate
        var param = Expression.Parameter(type, "source");
        var source = Expression.Convert(param, type);

        // Get the property on the source
        var get = Expression.MakeMemberAccess(source, property);
        var convert = Expression.Convert(get, typeof(TProp));

        // Construct the Expression
        var lambda = Expression.Lambda<Func<TObject, TProp>>(convert, param);

        // Compile to get the Func delegate type
        return lambda.Compile();
    }

私はここで情報を見つけました:リンク

私の問題を解決するためにそれを少し適応させました。すべてのコメント投稿者に感謝します...

于 2012-07-04T11:39:05.170 に答える