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

4
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)

Name是字符串类型。

如何获取类型?


您发布的代码对我来说无效。 x.Name 不是一种“UnaryExpression”。此外,您不应该像您现在这样使用“as”。如果转换失败,您将获得“NullReferenceException”,这不是好的做法,最好获取“InvalidCastException”以提供更清晰的提示。 - svick
4个回答

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

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


memberExpression.Member 是 MemberInfo 类型,无法转换为 MethodInfo。 - Rookian
MemberInfo是MethodInfo和PropertyInfo的基类。在您的情况下,我猜它是一个PropertyInfo。在这种情况下,请使用var returnType = ((PropertyInfo)memberExpression.Member).PropertyType;但由于您永远不会完全知道它是哪一个,所以您必须进行测试。我会更新我的答案。 - agent-j

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

这也修复了我在评论中提到的错误。


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

应该不难:

x.Name.GetType()


我想在Map方法中获取类型。 - Rookian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接