Linq表达式属性类型

时间:2014-07-15 12:24:39

标签: c# linq

我有一个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)。 我错过了一个完全明显的方法吗?或者我应该以这种非常丑陋的方式做这件事吗?

提前感谢您的帮助。

1 个答案:

答案 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);
    }
}