2017-07-26 210 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;