net - reflection c# español
Error "Método de conjunto de propiedades no encontrado" durante la reflexión (3)
De la documentación:
BindingFlags.SetProperty
Especifica que se debe establecer el valor de la propiedad especificada. Para las propiedades COM, especificar este indicador de enlace es equivalente a especificar PutDispProperty y PutRefDispProperty.
BindingFlags.SetProperty
y BindingFlags.GetProperty
no filtran las propiedades que faltan setters o getters, respectivamente.
Para verificar si se puede establecer una propiedad, use la propiedad CanWrite
.
if (pi.CanWrite)
pi.SetValue(this, valueFromData, null);
Intento reflexionar sobre algunas propiedades de clase y configurarlas programáticamente, pero parece que uno de mis filtros PropertyInfo no funciona:
//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 );
Estoy recibiendo un error en la línea
pi.SetValue(this, valueFromData, null);
Debido a que la propiedad solo tiene un método get{}
, ningún método set{}
.
Mi pregunta es, ¿por qué esta propiedad no se filtró de los accesorios? Pensé que ese era el propósito de BindingFlags.SetProperty.
La propiedad que no se filtra es:
public String CollTypeDescription
{
get { return _CollTypeDescription; }
}
Tenga en cuenta que quiero filtrar las propiedades que no funcionarán con anticipación, porque las estoy enumerando todas a la vez. No quiero usar pi.GetSetMethod()
después del hecho para determinar si puedo usar el setter.
Gracias a Ken por la información. Parece que la mejor solución que puedo obtener para filtrarlos es probar GetSetMethod (verdadero) en un filtro 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();
Entiendo el método GetProperties () para que devuelva todas las propiedades que tengan BindingFlags.GetProperty
o BindingFlags.SetProperty
.
Por lo tanto, si solo desea propiedades que tengan definidores, debe eliminar el indicador BindingFlags.GetProperty
. Pero no lo probé, así que puedo estar equivocado.
Mi respuesta obtuvo un -1. Entonces parece que mi respuesta es incorrecta.