首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有表达式创建新表达式

问从现有表达式创建新表达式
EN

Stack Overflow用户
提问于 2010-03-04 15:14:30
回答 1查看 5.6K关注 0票数 7

我有一个Expression<Func<T,DateTime>>,我想取表达式的DateTime部分,并从中提取月份。所以我会把它变成一个Expression<Func<T,int>>,我不太确定该怎么做。我看了看ExpressionTree Visitor,但我不能让它像我需要的那样工作。以下是DateTime表达式的示例

DateTimeExpression http://img442.imageshack.us/img442/6545/datetimeexpression.png

下面是我想要创建MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png的一个示例

看起来我需要创建一个新的MemberExpression,它由DateTime表达式中的Month属性组成,但我不确定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-04 15:20:42

是的,这正是您想要的-使用Expression.Property是实现此目的的最简单方法:

代码语言:javascript
复制
Expression func = Expression.Property(existingFunc.Body, "Month");
Expression<Func<T, int>> lambda = 
    Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters);

我相信这应该没问题。它在这个简单的测试中起作用:

代码语言:javascript
复制
using System;
using System.Linq.Expressions;

class Person
{
    public DateTime Birthday { get; set; }
}

class Test
{
    static void Main()
    {
        Person jon = new Person 
        { 
            Birthday = new DateTime(1976, 6, 19)
        };

        Expression<Func<Person,DateTime>> dateTimeExtract = p => p.Birthday;
        var monthExtract = ExtractMonth(dateTimeExtract);
        var compiled = monthExtract.Compile();
        Console.WriteLine(compiled(jon));
    }

    static Expression<Func<T,int>> ExtractMonth<T>
        (Expression<Func<T,DateTime>> existingFunc)
    {
        Expression func = Expression.Property(existingFunc.Body, "Month");
        Expression<Func<T, int>> lambda = 
            Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters);
        return lambda;
    }                                        
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2377452

复制
相关文章

相似问题

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