2010-08-02 22 views
28

que tienen el código de bucle a través de un objeto y obtener todas sus propiedades a través de la reflexión:Usando la reflexión, ¿cómo puedo detectar las propiedades que tienen instaladores?

foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var oldValue = propertyInfo.GetValue(oldVersion, null); 
} 

¿Cómo puedo hacer un cheque para que busque sólo en las propiedades que tienen un "ajuste" en ellos? (Quiero hacer caso omiso de sólo lectura los valores -. Simplemente "Get")

+1

No se olvide de propiedades con los emisores privados, protegidos, internos o internas protegidas .... esos alborotadores. –

+0

@ Dr.Wily'sApprentice ¿me puede explicar por qué es necesario? (especialmente los privados) Quiero decir, ¿es posible incluso acceder a campos y propiedades privadas debido a la reflexión? - Wohh ... lo busqué ... es posible. No dije nada. – LuckyLikey

Respuesta

29

Mi respuesta inicial era incorrecta - Proporcione accesorios a la respuesta de STO a continuación:

propertyInfo.CanWrite (documentation)

o

propertyInfo.GetSetMethod (documentation)

+0

Este me parece el método más limpio. – mpenrow

+2

No creo que pueda usar BindingFlags.SetProperty para consultar propiedades con setters. Esa bandera se puede usar cuando desee realizar una acción que implique realmente establecer una propiedad, como con el método Type.InvokeMember. –

+13

Esto no funciona. Use cualquiera de los métodos propuestos por STO a continuación y asegúrese de leer el comentario del Dr. Wily's Apprentice con respecto a las diferencias entre ellos. – JonathanK

12
propertyInfo.GetSetMethod() != null 
71

PropertyInfo.CanWrite (documentation)

o

PropertyInfo.GetSetMethod (documentation)

+0

Esto definitivamente funcionará, pero tendrá que hacer un control adicional para cada propiedad. Al establecer BindingFlags.SetProperty, solo recuperará las propiedades que contienen setters. –

+14

Recomendaría usar PropertyInfo.GetSetMethod y comprobar si es nulo; el método PropertyInfo.CanWrite devolverá verdadero si hay un conjunto privado, protegido o interno en la propiedad. Solo devolverá false si no hay setter en la propiedad. –

+0

Este funciona perfectamente. – vtortola

Cuestiones relacionadas