【问题标题】:Getting model type from expression从表达式中获取模型类型
【发布时间】:2017-07-26 20:51:08
【问题描述】:

我正在尝试使用反射来获取模型类型。到目前为止,我能够获得财产的类型。但是当我尝试使用表达式来获取模型类型时,我得到了该属性的空引用。

表情是这样的,

model => model.property

在功能上,

//I'm passing model as a parameter
MemberExpression expBody = expression.Body as MemberExpression;
model.GetType().GetProperty(expBody.Member.Name.ToString()));

有可能做这样的事情吗?

MemberExpression expBody = expression.Body as MemberExpression;
    expBody.Type.GetProperty(expBody.Member.Name.ToString()));

我试过了,但没用。

【问题讨论】:

标签: c# .net reflection system.reflection


【解决方案1】:

如果要获取模型的类型,只需这样做:

MemberExpression expbody = expression.Body as MemberExpression;
Type modelType = expbody.Expression.Type;

【讨论】:

    【解决方案2】:

    如果我们假设您的 expression 是一个 lambda 表达式,其 参数 是模型,则以下会产生您期望的行为:

    Expression<Func<Model, string>> expression = model => model.SomeStringProperty;
    Type modelType = expression.Parameters[0].Type;
    MemberExpression expBody = expression.Body as MemberExpression;
    PropertyInfo p = modelType.GetProperty(expBody.Member.Name);
    
    Assert.NotNull(p);
    

    请注意,modelType.GetProperty(expBody.Member.Name) 完全没有必要。最好从MemberExpression 本身中提取成员以避免歧义:

    PropertyInfo p = (PropertyInfo)expBody.Member;
    

    【讨论】:

    • 当我尝试.Getproperty时它会抛出空引用异常。
    • 我从表达式成员那里得到了propertyInfo,正如你所解释的。这是工作。 :)
    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2020-09-24
    • 2012-05-11
    相关资源
    最近更新 更多