7 votes

Comment comparer un même PropertyInfo avec différentes valeurs de ReflectedType ?

Voici un test simple qui illustre le problème :

class MyBase { public int Foo { get; set; } }    
class MyClass : MyBase { }    
[TestMethod]
public void TestPropertyCompare()
{
    var prop1 = typeof(MyBase).GetProperty("Foo");
    var prop2 = typeof(MyClass).GetProperty("Foo");
    Assert.IsTrue(prop1 == prop2); // fails
    //Assert.IsTrue(prop1.Equals(prop2)); // also fails
}

J'ai besoin d'une méthode de comparaison qui déterminera que ces deux propriétés représentent en fait la même propriété. Quelle est la bonne façon de procéder ?

En particulier, je veux vérifier que la propriété provient bien de la classe de base et qu'elle n'a pas été modifiée de quelque manière que ce soit, par exemple en la surchargeant (avec la fonction override int Foo ), caché (avec new int Foo ), les propriétés d'interface (c'est-à-dire la mise en œuvre explicite dans la classe dérivée ISome.Foo ) ou de toute autre manière qui conduit à ne pas appeler MyBase.Foo quand instanceOfDerived.Foo est utilisé.

8voto

jgauffin Points 51913

ReflectedType renvoie toujours le type sur lequel vous effectuez la réflexion. DeclaringType indique dans quel type la propriété est déclarée. Ainsi, votre contrôle égal doit être remplacé par :

public static class TypeExtensions
{
    public static bool PropertyEquals(this PropertyInfo property, PropertyInfo other)
    {
         return property.DeclaringType == other.DeclaringType
                    && property.Name == other.Name;
    }
}

Utilisation :

var prop1 = typeof(MyBase).GetProperty("Foo");
var prop2 = typeof(MyClass).GetProperty("Foo");
var isSame = prop1.PropertyEquals(prop2); //will return true

Edit : Suppression de la vérification du PropertyType comme suggéré par @Rob dans les commentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X