2017-07-26 174 views
0

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

表达是这样的,

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

我试过了,但没有工作。

+1

请阅读[问问]。你怎么称呼这个(“传球模式”不清楚)?这是如何“不工作”?你有什么尝试?请参阅[通过MemberExpression获取属性类型](https://stackoverflow.com/questions/10224119/get-property-type-by-memberexpression)和[.NET反射 - 从实例属性获取声明类类型](https:// stackoverflow.com/questions/5017744/net-reflection-get-declaring-class-type-from-instance-property)。 – CodeCaster

回答

0

如果我们假设您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; 
+0

当我尝试使用'.Getproperty'时,它会抛出空引用异常。 – Prajwal

+0

我从表达式成员那里得到了'propertyInfo',正如你所解释的那样。这是工作。 :) – Prajwal

1

如果你想要得到的模型的类型,只是这样做:

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