2017-07-26 3 views
0

J'essaie d'utiliser la réflexion pour obtenir le type de modèle. Jusqu'à présent, j'ai été en mesure d'obtenir le type de propriété. Mais quand j'ai essayé d'utiliser l'expression pour obtenir le type de modèle, j'obtiens une référence nulle pour cette propriété.Obtention du type de modèle à partir de l'expression

expression

est comme ça,

model => model.property 

et en fonction,

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

Est-il possible de faire quelque chose comme ça?

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

J'ai essayé ceci, mais je ne travaillais pas.

+1

Veuillez lire [ask]. Comment appelez-vous cela ("passage modèle" n'est pas clair)? Comment est-ce "ne fonctionne pas"? Qu'avez-vous essayé? Voir [Obtenir le type de propriété par MemberExpression] (https://stackoverflow.com/questions/10224119/get-property-type-by-memberexpression) et [.NET reflection - Get Déclaration du type de classe à partir de la propriété d'instance] (https: // stackoverflow.com/questions/5017744/net-reflection-get-declaring-class-type-from-instance-property). – CodeCaster

Répondre

0

Si nous supposons que votre expression est une expression lambda dont paramètre est modèle, ce qui suit produit le comportement que vous attendez :

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

Notez que modelType.GetProperty(expBody.Member.Name) est complètement inutile. Il est préférable d'extraire le membre du MemberExpression lui-même afin d'éviter toute ambiguïté:

PropertyInfo p = (PropertyInfo)expBody.Member; 
+0

il jette une exception de référence null lorsque j'essaie de '.Getproperty'. – Prajwal

+0

J'ai reçu 'propertyInfo' de l'expression Member comme vous l'avez expliqué. Ça fonctionne. :) – Prajwal

1

Si vous voulez obtenir le type de modèle, il suffit de ceci:

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