Comment obtenir la valeur de propriété de MemberExpression sans .Compile ()?

c# expression-trees

Question

J'ai des problèmes pour obtenir la valeur d'un objet de l'arbre d'expression sans utiliser .Compile ()

L'objet est assez simple.

var userModel = new UserModel { Email = "John@Doe.com"};

La méthode qui me donne des problèmes ressemble à ceci.

var userModel = new UserModel { Email = "John@Doe.com"};

Les tests que je fais sont assez simples

var userModel = new UserModel { Email = "John@Doe.com"};
var userModel = new UserModel { Email = "John@Doe.com"};

Je devrais noter que changer

var userModel = new UserModel { Email = "John@Doe.com"};

à

var userModel = new UserModel { Email = "John@Doe.com"};

permettra au test de passer, mais ce code doit être exécuté sur iOS et ne peut donc pas utiliser .Compile()

Réponse acceptée

TLDR;
Reflection peut être utilisé tant que vous n'utilisez pas Emit ou Compile . Dans la question, la valeur est extraite pour FieldInfo , mais pas pour PropertyInfo . Assurez-vous que vous pouvez obtenir les deux.

if ((expression.Member as PropertyInfo) != null)
{
    // get the value from the PROPERTY

}
else if ((expression.Member as FieldInfo) != null)
{
    // get the value from the FIELD
}
else
{
    throw new InvalidMemberException();
}

Version longue

Les commentaires m'ont donc orienté dans la bonne direction. J'ai eu un peu de mal à obtenir le PropertyInfo, mais au final, voici ce que j'ai proposé.

if ((expression.Member as PropertyInfo) != null)
{
    // get the value from the PROPERTY

}
else if ((expression.Member as FieldInfo) != null)
{
    // get the value from the FIELD
}
else
{
    throw new InvalidMemberException();
}

Essentiellement, si Member.NodeType est un Parameter , je vais l'utiliser comme un champ SQL. [FieldName]

Sinon, je l'utilise en tant que paramètre SQL @FieldName ... à l'envers, je le sais.

Si Member.NodeType n'est PAS un paramètre, je vérifie s'il s'agit d'un Field modèle ou d'une Property modèle. De là, j'obtiens la valeur appropriée et ajoute la paire clé / valeur à un dictionnaire à utiliser comme paramètres SQL.

Le résultat final est que je construis une chaîne qui ressemble à quelque chose comme

if ((expression.Member as PropertyInfo) != null)
{
    // get the value from the PROPERTY

}
else if ((expression.Member as FieldInfo) != null)
{
    // get the value from the FIELD
}
else
{
    throw new InvalidMemberException();
}

Ensuite, les paramètres sont passés

if ((expression.Member as PropertyInfo) != null)
{
    // get the value from the PROPERTY

}
else if ((expression.Member as FieldInfo) != null)
{
    // get the value from the FIELD
}
else
{
    throw new InvalidMemberException();
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi