如何获取泛型表达式中使用的属性的类型?

时间:2011-06-26 14:20:41

标签: c# generics expression expression-trees

public static void Map<T>(Expression<Func<T, object >> expression)
{
    var memberExpression = (expression.Body as UnaryExpression).Operand as MemberExpression;
    var name = memberExpression.Member.Name;
}

用法:

Map<Article>(x => x.Name)

名称的类型为字符串。

我如何获得该类型?

4 个答案:

答案 0 :(得分:3)

var returnType = memberExpression.Member is MethodInfo 
    ? ((MethodInfo)memberExpression.Member).ReturnType 
    : ((PropertyInfo)memberExpression.Member).PropertyType;

我假设你想要返回类型。如果您想要定义方法的类型,请使用memberExpression.Member.DeclaringType

答案 1 :(得分:1)

如果你知道它永远是一个属性(而不是一个字段),你可以这样做:

public static void Map<T>(Expression<Func<T, object>> expression)
{
    var memberExpression = (MemberExpression)expression.Body;
    var property = (PropertyInfo)memberExpression.Member;
    var name = property.Name.Dump();
    var type = property.PropertyType.Dump();
}

这也解决了我在评论中提到的错误。

答案 2 :(得分:1)

这是一个简单的表达式扩展方法,可能对其他人有用。

 public static Type GetPropertyType<TModel, TValue>(this Expression<Func<TModel, TValue>> expression)
    {
        var body = expression.Body as MemberExpression;
        if (body == null)
        {
            throw new ArgumentException("'expression' should be a member expression");
        }
        return ((PropertyInfo)body.Member).PropertyType;
    }

样本用法:

if (expression.GetPropertyType() == typeof(DateTime))

答案 3 :(得分:-3)

不应该太困难:

x.Name.GetType()