首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Expression<Func<TProperty>>转换为Func<TObject,TProperty>,其中TObject是已知的

将Expression<Func<TProperty>>转换为Func<TObject,TProperty>,其中TObject是已知的
EN

Stack Overflow用户
提问于 2012-07-04 16:09:43
回答 1查看 418关注 0票数 0

我正在尝试转换一个:

代码语言:javascript
复制
Expression<Func<TProperty>>

到一个

代码语言:javascript
复制
Func<TObject, TProperty>

其中TObject是已知的,并公开由表达式表示的属性。为此,我设想必须操作表达式,将其与新表达式中的TObject类型参数组合,然后进行编译。

编辑:示例输入和输出

代码语言:javascript
复制
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);
   }
}

我希望作为输入的表达式:

代码语言:javascript
复制
Expression<Func<int>> inputExpression = () => Number;

此表达式指向SomeType上的Number属性

一个我期望作为输出的Func委托:

代码语言:javascript
复制
Func<SomeType, int> outputFunc = type => type.Number;

结束编辑

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-04 19:39:05

我找到了我问题的答案:

代码语言:javascript
复制
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();
    }

我在这里找到了相关信息:link

稍微修改一下就可以解决我的问题了。感谢所有评论者……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11324956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档