我有一个linq表达式定义如下:
private void GetMyPropertyType<T>(Expression<Func<T, object>> expression)
{
// some code
----- HERE -----
}
被称为
GetMyPropertyType<SomeType>(x => x.Age);
现在我想知道标有“HERE”的位置的“Age”类型是什么。 我得到的最接近的是:“
expression.Body.Member.ToString()
返回值Int64 Age
,然后我可以拆分,只取第一部分。但问题是我想获得它只返回某些类型(如System.Int64
)的完整路径(String
)。
我错过了一个完全明显的方法吗?或者我应该以这种非常丑陋的方式做这件事吗?
提前感谢您的帮助。
答案 0 :(得分:6)
您可以使用Expression.Type
找出表达式的静态类型。但是,因为您已经获得了Expression<Func<T, object>>
,所以您实际上已经在属性表达式周围获得了转换表达式,因此您需要先删除它。这是一些示例代码,适用于我尝试过的简单案例:
using System;
using System.Linq.Expressions;
class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
class Test
{
static void Main(string[] args)
{
ShowMemberType<Person>(p => p.Age);
ShowMemberType<Person>(p => p.Name);
}
static void ShowMemberType<T>(Expression<Func<T, object>> expression)
{
var body = expression.Body;
// Unwrap the conversion to object, if there is one.
if (body.NodeType == ExpressionType.Convert)
{
body = ((UnaryExpression)body).Operand;
}
Console.WriteLine("Type: {0}", body.Type);
}
}