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()
精彩评论