Lo mismo para también métodos:¿Cómo comparo dos PropertyInfos o métodos de manera confiable?
me dan dos ejemplos de PropertyInfo o métodos que han sido extraídos de la clase que se sientan en medio de GetProperty()
o GetMember()
etc, (o tal vez de una MemberExpression).
Quiero determinar si son, de hecho, refiriéndose a la misma propiedad o el mismo método por lo
(propertyOne == propertyTwo)
o
(methodOne == methodTwo)
Es evidente que no se va a trabajar en realidad, es posible que estar buscando la misma propiedad, pero podría haber sido extraída de diferentes niveles de la jerarquía de clases (en cuyo caso generalmente, propertyOne != propertyTwo
)
De curso e, yo pude ver DeclaringType, y volver a la petición de la propiedad, pero esto empieza a tener un poco confuso cuando se empieza a pensar en
- Propiedades/métodos declarados en las interfaces e implementados en clases
- Propiedades/Los métodos declarados en una clase base (virtualmente) y cambiados en las clases derivadas
- Propiedades/métodos declarados en una clase base, se reemplaza con el 'nuevo' (en la IL mundo esto no es nada IIRC especial)
al final de la día, solo quiero poder hacer una ecuación inteligente verificación de la calidad entre dos propiedades o dos métodos, estoy 80% seguro de que los puntos anteriores no cubren todos los casos extremos, y aunque podía simplemente sentarme, escribir un montón de pruebas y comenzar a jugar sobre, me ' Estoy muy consciente de que mi bajo nivel de conocimiento sobre cómo estos conceptos se implementan realmente no es excelente, y espero que este sea un tema ya respondido y me apetece buscar.
La mejor respuesta me daría un par de métodos que permitan alcanzar lo anterior, explicando qué casos extremos han sido atendidos y por qué :-)
Aclaración:
Literalmente, Quiero para asegurarse de que son la misma propiedad, he aquí algunos ejemplos
public interface IFoo
{
string Bar { get; set; }
}
public class Foo : IFoo
{
string Bar { get; set; }
}
typeof(IFoo).GetProperty("Bar")
y
typeof(Foo).GetProperty("Bar")
Volverá dos informaciones de propiedad, que no son iguales:
public class BaseClass
{
public string SomeProperty { get; set ; }
}
public class DerivedClass : BaseClass { }
typeof(BaseClass).GetMethod("SomeProperty")
y
typeof(DerivedClass).GetProperty("SomeProperty")
realidad no puedo recordar si estos dos objetos de retorno igual ahora, pero en mi mundo son iguales.
mismo modo:
public class BaseClass
{
public virtual SomeMethod() { }
}
public class DerivedClass
{
public override SomeMethod() { }
}
typeof(BaseClass).GetMethod("SomeMethod")
y
typeof(DerivedClass).GetProperty("SomeMethod")
vez más, estos no coincidirán - pero ellos quieren (sé que no son específicamente iguales, pero en mi dominio que están porque se refieren a la misma propiedad original)
Podría hacerlo estructuralmente, pero eso sería 'incorrecto'.
Otras indicaciones:
¿Cómo se puede solicitar incluso la propiedad que se esconde otra propiedad? Parece que uno de mis supuestos anteriores no era válido, que la implementación predeterminada de GetProperty("name")
se referiría al nivel actual de forma predeterminada.
BindingFlags.DeclaringType
parece que acaba regresando nulo!
"Propiedades/Métodos declarados en una clase base, que se modifique con 'nuevo'" - Eso se llama en realidad * * escondite, y son sin duda * * miembros diferentes. No tiene sentido verlos como "iguales" en absoluto. – Ani
Bueno, obviamente, sólo lo expresó tan mal - que sería muy difícil escribir código de comparación para devolver cierto en esa circunstancia ;-) - sigue siendo un camino infeliz que necesita pruebas, tal como se me ocurre código de comparación estructural que devolvería cierto . –
¿Puedes aclarar mejor la pregunta? ¿Desea 'string.GetHashCode == int.GetHashCode' (porque sus definiciones base están en el mismo tipo -' object'). ¿Qué tal 'List .Count' contra' HashSet .Count' (ambos implementan 'ICollection .Count')? –
Ani