tag propiedad español c# .net reflection inheritance

español - Ocultación y reflexión de la propiedad(C#)



reflection c# español (3)

A través de la reflexión, la nueva palabra clave solo oculta la propiedad heredada si la firma coincide. Supongo que la reflexión coincide con las firmas en los accesores de propiedades (get_ & set_). Son las razones por las que GetProperties() devuelve BP y CP cuando el tipo de retorno difiere.

Recientemente descubrí Fasteflect que proporciona mecanismos avanzados de reflexión.

Lo comprobé y el tipo type.Properties Las type.Properties devuelven todo el árbol de miembros ocultos (P). Creo que la API considera respaldar a los miembros (virtual / anular) y a los miembros ocultos (nuevos) de manera diferente, lo que es bueno para su "problema";)

Mi prueba con quickflect:

class Class1 { public object field1 = null; public virtual object Property1 { get; set; } public object Property2 { get; set; } public string Property3 { get; set; } } class Class2 : Class1 { public new object field1 = null; public override object Property1 { get; set; } public new string Property3 { get; set; } } class Class3 : Class2 { public new string Property3 { get; set; } }

Filtra los miembros de respaldo pero devuelve todos los miembros ocultos:

typeof(Class3).Properties(Flags.ExcludeBackingMembers | Flags.Public | Flags.Instance)

  • typeof (Class3) .Properties (Flags.ExcludeBackingMembers | Flags.Public | Flags.Instance) Count = 5 System.Collections.Generic.IList
    • [0] {System.String Property3} System.Reflection.PropertyInfo
    • [1] {System.Object Property1} System.Reflection.PropertyInfo
    • [2] {System.String Property3} System.Reflection.PropertyInfo
    • [3] {System.Object Property2} System.Reflection.PropertyInfo
    • [4] {System.String Property3} System.Reflection.PropertyInfo

La declaración de una propiedad en una clase derivada que coincide con el nombre de una propiedad en la clase base "lo oculta" (a menos que la anule con la palabra clave de override ). Tanto las propiedades de la clase base como las derivadas serán devueltas por Type.GetProperties() si sus tipos no coinciden. Sin embargo, si sus tipos coinciden, sorprendentemente solo se devuelve la propiedad de la clase derivada. Por ejemplo:

class A { protected double p; public int P { get { return (int)p; } set { p = value; } } } class B : A { public new int P { get { return (int)p; } set { p = value; } } } class C : B { public new float P { get { return (float)p; } set { p = value; } } }

Llamar a typeof(C).GetProperties() solo devolverá BP y CP ¿Es posible llamar a GetProperties() de una manera que devuelva los tres? Es casi seguro que hay una forma de hacerlo atravesando la jerarquía de herencia, pero ¿hay una solución más limpia?


GetProperties se define como todas las propiedades públicas del tipo.

Usted podría obtener sus métodos de obtener y establecer utilizando:

typeof(C).GetMethods() .Where(m => m.Name.StartsWith("set_") || m.Name.StartsWith("get_"))

Aunque esto parece una mala idea, comparado con bajar la jerarquía de herencia para obtener las propiedades.


No creo que sea posible sin atravesar la jerarquía de herencia. Sin embargo, no tiene que ser demasiado código:

public static IEnumerable<PropertyInfo> GetAllProperties(Type t) { while (t != typeof(object)) { foreach (var prop in t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)) yield return prop; t = t.BaseType; } }

Por supuesto, si conoce un tipo de base común en el que puede detenerse, en lugar de un objeto, será más eficiente. También; Tomará algún tiempo hacer la reflexión, por lo tanto, caché el resultado. Después de todo, la información de tipo no cambiará durante la ejecución.