Как получить тип свойства, используемого в обобщенном выражении? - PullRequest
3 голосов
/ 26 июня 2011
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)

Имя имеет тип string.

Как мне получить тип?

Ответы [ 4 ]

3 голосов
/ 26 июня 2011
var returnType = memberExpression.Member is MethodInfo 
    ? ((MethodInfo)memberExpression.Member).ReturnType 
    : ((PropertyInfo)memberExpression.Member).PropertyType;

Полагаю, вам нужен тип возвращаемого значения.Если вы хотите тип, для которого определен метод, используйте memberExpression.Member.DeclaringType.

1 голос
/ 19 ноября 2014

Вот простой метод расширения выражений, который может быть полезен другим.

 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))
1 голос
/ 26 июня 2011

Если вы знаете, что это всегда будет свойство (а не поле), вы можете сделать это следующим образом:

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

Это также исправляет ошибку, о которой я упоминал в комментарии.

0 голосов
/ 26 июня 2011

Не должно быть слишком сложно:

x.Name.GetType()

...