Arbre d'expression C # pour appeler la méthode get de la propriété de la classe de base

.net-4.5 c# expression-trees reflection

Question

J'ai construit un arbre d'expression qui dérive les paramètres d'une classe et les appelle pour définir des valeurs dans une autre classe. Cela fonctionne très bien pour la plupart des types, mais il échoue sur un type dérivé. Si j'ai:

public class A
{
    public string MyString {get; set;}
}

et

public class A
{
    public string MyString {get; set;}
}

Si j'utilise ce code de l'arbre d'expression (où value correspond à l'instance dérivée):

public class A
{
    public string MyString {get; set;}
}

Je vais recevoir cette exception:

public class A
{
    public string MyString {get; set;}
}

Qu'est-ce que je fais mal ici?

Réponse acceptée

Vous devez utiliser la propriété elle-même et non la méthode Getter:

foreach (var property in properties)
{
    Expression.Property( 
         Expression.ConvertChecked( inputObject, property.DeclaringType ),
         property);
}

Fondamentalement, vous devez utiliser cette méthode Property au lieu de cette méthode Property surchargée.

METTRE À JOUR

Pour l'approche GetGetMethod - Si var objectType égal à A type, cela fonctionne. Si cela correspond au type B , cela ne fonctionne pas.

Je suppose que le problème se trouve dans property.DeclaringType . Dans les deux cas, il s'agit d' A type, comme propriété déclarée dans celui-ci. Mais ce code renverra ReflectedType différent pour la même propriété:

foreach (var property in properties)
{
    Expression.Property( 
         Expression.ConvertChecked( inputObject, property.DeclaringType ),
         property);
}

Pour A il retourne A , et pour le type B il retourne B Mon hypothèse est que, dans le cas B , la logique Expression.Property vérifie que property.DeclaringType est A , mais GetGetMethod a ReflectedType égal à B et pense donc qu'il s'agit de la propriété d'un autre objet. Je n'ai pas de preuves pour cela, mais seuls ces membres sont différents entre deux appels GetGetMethod

UPDATE2

Voici un code utilisé par Expression.Property (méthode MethodInfo):

foreach (var property in properties)
{
    Expression.Property( 
         Expression.ConvertChecked( inputObject, property.DeclaringType ),
         property);
}

Le problème est dans cette ligne:

foreach (var property in properties)
{
    Expression.Property( 
         Expression.ConvertChecked( inputObject, property.DeclaringType ),
         property);
}

Lorsque vous obtenez MethodInfo par GetGetMethod à partir de type A , il est différent de MethodInfo à partir de type B et cette vérification renvoie false. Cet exemple retourne également false:

foreach (var property in properties)
{
    Expression.Property( 
         Expression.ConvertChecked( inputObject, property.DeclaringType ),
         property);
}



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