Подтвердить что ты не робот

Можно ли получить свойство частного сеттера через отражение?

Я написал собственный сериализатор, который работает, устанавливая свойства объекта путем отражения. Сериализуемые классы помечены атрибутом serializable, и все сериализуемые свойства также помечены. Например, следующий класс сериализуем:

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

   public string SometthingNotSerializable {get; set;}
}

Когда сериализатору предлагается десериализовать SomethingSerializable, он получает установленный метод свойства и использует его для его установки, выполняя что-то вроде этого:

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

Это прекрасно работает, однако, как я могу сделать свойство setter доступным только для сериализатора? Если сеттер закрыт:

public string SomethingSerializable {get; private set;}

тогда вызов propertyInfo.GetSetMethod() возвращает null в сериализаторе. Есть ли способ доступа к частному сетевому устройству или каким-либо другим способом, чтобы обеспечить доступ только к сериализатору? Сериализатор не гарантированно находится в одной и той же сборке.

4b9b3361

Ответ 1

Как вы уже выяснили, один из способов доступа к непубличному сетевому устройству выглядит следующим образом:

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

Есть и другой способ, если я правильно помню:

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