Linq表达式属性类型

Voi*_*paw 1 c# linq

我有一个linq表达式定义如下:

private void GetMyPropertyType<T>(Expression<Func<T, object>> expression)
{
    // some code
    ----- HERE -----
}
Run Code Online (Sandbox Code Playgroud)

被称为

GetMyPropertyType<SomeType>(x => x.Age);
Run Code Online (Sandbox Code Playgroud)

现在我想知道标记为"HERE"的位置的"Age"类型是什么.我得到的最接近的是:"

expression.Body.Member.ToString()
Run Code Online (Sandbox Code Playgroud)

返回Int64 Age我可以拆分的值,只取第一部分.然而问题是我想得到System.Int64它只返回某些类型(如String)的完整路径().我错过了一个完全明显的方法吗?或者我应该以这种非常丑陋的方式做到这一点?

在此先感谢您的帮助.

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)