Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取表达式中成员的类型_C#_C# 4.0_Lambda_Expression Trees - Fatal编程技术网

C# 获取表达式中成员的类型

C# 获取表达式中成员的类型,c#,c#-4.0,lambda,expression-trees,C#,C# 4.0,Lambda,Expression Trees,我正在尝试学习表达式,但找不到如何在表达式中获取属性的成员类型。例如,考虑这种方法: static IEnumerable<Y> Filter<X,Y>(this IEnumerable<Person> p, Expression<Func<Person,X>> select, Expression<Func<X, Y>> format) { foreach (var item in p) {

我正在尝试学习表达式,但找不到如何在表达式中获取属性的成员类型。例如,考虑这种方法:

static IEnumerable<Y> Filter<X,Y>(this IEnumerable<Person> p,  Expression<Func<Person,X>> select,  Expression<Func<X, Y>> format)
{
    foreach (var item in p)
    {
        // member name
        var m = ((MemberExpression)select.Body).Member;

        // member attributes
        var attributes = m.GetCustomAttributes(false);

        // member type?

        var a = select.Compile().Invoke(item);
        var b = format.Compile().Invoke(a);
        m.ToString();
        yield return b;
    }
}
我可以得到收藏中人物的年份。我想知道“Filter”方法中“p.DateOfBirth”的类型。如果不使用反射,我怎么能做到这一点


问候。

假设我理解正确,您只需要属性:

using System;
using System.Linq.Expressions;

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

public class Test
{
    static void Main()
    {
        Expression<Func<Person, DateTime>> expression = p => p.DateOfBirth;

        MemberExpression memberExpression = (MemberExpression) expression.Body;
        Console.WriteLine(memberExpression.Type); // Prints System.DateTime
    }    
}
使用系统;
使用System.Linq.Expressions;
班主任
{
公共日期时间出生日期{get;set;}
}
公开课考试
{
静态void Main()
{
表达式=p=>p.DateOfBirth;
MemberExpression MemberExpression=(MemberExpression)expression.Body;
Console.WriteLine(memberExpression.Type);//打印System.DateTime
}    
}

+1用于在一个函数式编程(如flow)中过滤(项目)和格式化。但是你能澄清一下吗?您的问题是否真的是如何用泛型类型参数替换
过滤器
签名中的
人员
?还是乔恩按对了键?谢谢。这正是乔恩的回答。代码只是我用来理解表达式的几个测试的一部分,我想知道如何获取成员的类型。也许你会感到困惑,因为我问了一个非常明显的问题:汉克斯,这正是我想要的。这件事太明显了,我没有看到,这让我很烦恼:D
using System;
using System.Linq.Expressions;

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

public class Test
{
    static void Main()
    {
        Expression<Func<Person, DateTime>> expression = p => p.DateOfBirth;

        MemberExpression memberExpression = (MemberExpression) expression.Body;
        Console.WriteLine(memberExpression.Type); // Prints System.DateTime
    }    
}