Utilisation de l'expression lambda pour obtenir la propriété OU le nom de type

c# expression-trees lambda

Question

Comment puis-je adapter la méthode ci-dessous pour que fonctionner lorsque l'expression lambda fait référence à l'instance elle-même?

par exemple au lieu de

x => x.Name

l'expression est

x => x.Name

donc si j'avais une classe "Car", je pourrais renvoyer la chaîne "Car" au lieu de pouvoir uniquement utiliser ses propriétés (par exemple, Car.Colour)

La méthode:

x => x.Name

c'est-à-dire que je veux quelque chose comme:

x => x.Name

Réponse acceptée

J'ai remonté à la construction de l'expression. Il ne contient vraiment aucune information d'instance et aucun moyen d'obtenir le nom du type.

static Expression<Func<object, object>> thisObject = x => x;

Il est donc impossible qu'un nom de type puisse être dérivé d'une expression qui n'a même pas de type (autre qu'un objet).

La méthode utilisée pour générer une expression qui renvoie un nom de propriété:

static Expression<Func<object, object>> thisObject = x => x;

Réponse populaire

Je peux être mal compris, mais un x => x direct x => x sera un ParameterExpression . Ajoutez simplement un test supplémentaire sous votre test is MemberExpression existant:

if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}

En utilisant ce code:

if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}

if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}
if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}
if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}
if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}



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