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
}
}