with net method español create c# .net reflection

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.