2012-02-09 11 views
20

Escribí un serializador personalizado que funciona estableciendo las propiedades del objeto por reflexión. Las clases serializables están etiquetadas con un atributo serializable y todas las propiedades serializables también están etiquetadas. Por ejemplo, la siguiente clase es serializable:¿Es posible obtener el organismo privado de una propiedad a través de la reflexión?

[Serializable] 
public class Foo 
{ 
    [SerializableProperty] 
    public string SomethingSerializable {get; set;} 

    public string SometthingNotSerializable {get; set;} 
} 

Cuando se le pide al serializador deserializar SomethingSerializable, se pone el método conjunto de la propiedad y lo utiliza para configurarlo haciendo algo como esto:

PropertyInfo propertyInfo; //the property info of the property to set 
//...// 
if (propertyInfo.CanWrite && propertyInfo.GetSetMethod() != null) 
{ 
    propertyInfo.GetSetMethod().Invoke(obj, new object[]{val}); 
} 

Esto funciona bien, sin embargo, ¿cómo puedo hacer que el establecimiento de propiedades solo sea accesible para el serializador? Si el colocador es privado:

public string SomethingSerializable {get; private set;} 

entonces la llamada a propertyInfo.GetSetMethod() devuelve un valor nulo en el serializador. ¿Hay alguna forma de acceder al setter privado o de otra forma para asegurar que solo el serializador pueda acceder al setter? No se garantiza que el serializador esté en el mismo ensamblaje.

Respuesta

30

Como ya descubierto, una forma de acceder a un colocador no pública es el siguiente:

PropertyInfo property = typeof(Type).GetProperty("Property"); 
property.GetSetMethod(true).Invoke(obj, new object[] { value }); 

Hay otra manera, sin embargo, si no recuerdo mal:

PropertyInfo property = typeof(Type).GetProperty("Property"); 
property.SetValue(obj, value, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null); 
+2

Primero uno ¡me funciona muy bien! – Roboblob

+2

Primero funciona, el segundo no – gibarsin

+1

Primero funciona; en el segundo en "propiedad" devuelve valor nulo. –

Cuestiones relacionadas