2012-02-20 21 views
21

Estoy tratando de reflexionar sobre algunas propiedades de la clase y los puso programaticlly, pero parece que uno de mis filtros PropertyInfo no está funcionando:"método set Propiedad no encontrada" error durante la reflexión

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty); 

I estoy poniendo un error en la línea

pi.SetValue(this, valueFromData, null); 

Dado que la propiedad sólo tiene un método get{}, sin set{} método.

Mi pregunta es, ¿por qué no se ha filtrado esta propiedad de los accesorios? Pensé que ese era el propósito de BindingFlags.SetProperty.

La propiedad no siendo filtrada es:

public String CollTypeDescription 
    { 
     get { return _CollTypeDescription; } 
    } 

en cuenta que yo quiero filtrar propiedades que no van a trabajar antes de tiempo, porque todos ellos estoy lista a la vez. Hago no quiero usar pi.GetSetMethod() después del hecho para determinar si puedo usar el setter.

+2

@dtryon - no - que es O-ing juntas las banderas de las opciones que quiere establecer . –

Respuesta

51

De la documentación:

BindingFlags.SetProperty

Especifica que el valor de la propiedad especificada se debe establecer. Para las propiedades COM , especificar este marcador de enlace es equivalente a especificando PutDispProperty y PutRefDispProperty.

BindingFlags.SetProperty y BindingFlags.GetPropertyNo propiedades de filtro que faltan los emisores o captadores, respectivamente.

Para verificar si se puede establecer una propiedad, use la propiedad CanWrite.

if (pi.CanWrite) 
    pi.SetValue(this, valueFromData, null); 
+0

Gracias por la información: no puedo usar CanWrite porque esto solo revela entidades públicas, y aún puedo hacer uso de instaladores privados ya que estoy haciendo esto desde dentro de la clase. – Alain

+0

@Alain - ¿Estás seguro? Acabo de hacer una prueba con una propiedad privada con un getter y setter. La propiedad CanWrite devolvió verdadero para esa propiedad privada. – ken

+0

Malentendido de mi parte. Estás en lo correcto: los dos son intercambiables, y como tu método no requiere una prueba nula, es preferible. – Alain

-1

entiendo la GetProperties() método para que devuelva todas las propiedades que tiene BindingFlags.GetPropertyoBindingFlags.SetProperty.
Por lo tanto, si solo desea propiedades que tengan definidores, debe eliminar la marca BindingFlags.GetProperty. Pero no lo probé, así que puedo estar equivocado.

Mi respuesta obtuvo un -1. Entonces parece que mi respuesta es incorrecta.

2

Gracias a Ken para la información. Parece que la mejor solución que puedo conseguir que se filtre a cabo mediante pruebas de GetSetMethod (verdadero) en un filtro de LINQ:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null).ToArray(); 
+0

Ver mi comentario en mi respuesta. CanWrite está volviendo 'verdadero' para mí para propiedades privadas. ¿No está funcionando de la misma manera para ti? – ken

Cuestiones relacionadas