开发者

How to get the type of a property used within a generic expression?

开发者 https://www.devze.com 2023-03-15 06:40 出处:网络
public st开发者_Go百科atic void Map<T>(Expression<Func<T, object >> expression)
public st开发者_Go百科atic void Map<T>(Expression<Func<T, object >> expression)
{
    var memberExpression = (expression.Body as UnaryExpression).Operand as MemberExpression;
    var name = memberExpression.Member.Name;
}

Usage:

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

Name is of type string.

How do I get the type?


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

I assume you want the return type. If you want the type on which the method is defined, use memberExpression.Member.DeclaringType.


If you know that it will always be a property (and not a field), you can do it like this:

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();
}

This also fixes the error I mentioned in a comment.


Here is a simple Expression Extension Method that may be useful to others.

 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;
    }

Sample usage:

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


Shouldn't be too difficult:

x.Name.GetType()

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号