Rado Rado - 1 day ago 4
C# Question

Is it possible to get a property's private setter through reflection?

I wrote a custom serializer that works by setting object properties by reflection. Serializable classes are tagged with serializable attribute and all serializable properties are also tagged. For example, the following class is serializable:

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

public string SometthingNotSerializable {get; set;}
}


When the serializer is asked to deserialize
SomethingSerializable
, it gets the set method of the property and uses it to set it by doing something like this:

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


This works fine, however, how can I make the property setter accessible only to the serializer? If the setter is private:

public string SomethingSerializable {get; private set;}


then the call to
propertyInfo.GetSetMethod()
returns null in the serializer. Is there any way to access the private setter or any other way to ensure that only the serializer can access the setter? The serializer is not guaranteed to be in the same assembly.

Answer

As you already figured out, one way to access a non-public setter is as follows:

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

There is another way, though, if I recall correctly:

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