我有一个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)的完整路径().我错过了一个完全明显的方法吗?或者我应该以这种非常丑陋的方式做到这一点?
在此先感谢您的帮助.
您可以使用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)