【问题标题】:How to get the type of a property used within a generic expression?如何获取泛型表达式中使用的属性类型?
【发布时间】:2011-06-26 14:20:41
【问题描述】:
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 会更清晰。

标签: c# generics expression expression-trees


【解决方案1】:
var returnType = memberExpression.Member is MethodInfo 
    ? ((MethodInfo)memberExpression.Member).ReturnType 
    : ((PropertyInfo)memberExpression.Member).PropertyType;

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

【讨论】:

  • memberExpression.Member 是 MemberInfo 类型,不能转换为 MethodInfo。
  • MemberInfo 是 MethodInfo 和 PropertyInfo 的基类。在你的情况下,我猜它是一个 PropertyInfo。在这种情况下,请使用 var returnType = ((PropertyInfo)memberExpression.Member).PropertyType; 但由于您永远不会完全知道它是哪一个,因此您必须进行测试。我会更新我的答案。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      应该不会太难:

      x.Name.GetType()

      【讨论】:

      • 我想在 Map 方法中获取类型。
      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2019-07-27
      • 2015-07-28
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多