0

我正在尝试转换:

Expression<Func<TProperty>>

到一个

Func<TObject, TProperty>

其中 TObject 是已知的,并公开了由 Expression 表示的属性。为此,我想必须操作表达式,将它与 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;

结束编辑

问题是,我不知道该怎么做。我真的很感激一些(参考)关于操作 Lambda 表达式的可访问信息,因为我还没有遇到任何信息。

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