Могу ли я установить частное свойство через отражение?
public abstract class Entity
{
private int _id;
private DateTime? _createdOn;
public virtual T Id
{
get { return _id; }
private set { ChangePropertyAndNotify(ref _id, value, x => Id); }
}
public virtual DateTime? CreatedOn
{
get { return _createdOn; }
private set { ChangePropertyAndNotify(ref _createdOn, value, x => CreatedOn); }
}
}
Я пробовал следующее, и это не работает, где t
представляет собой тип Entity
:
var t = typeof(Entity);
var mi = t.GetMethod("set_CreatedOn", BindingFlags.Instance | BindingFlags.NonPublic);
Думаю, я могу это сделать, но не могу.
2
Я знаю, что это поздно, но у меня возникла потребность в этой мысли, и я поделюсь своим «почему». Мне нужно было преодолеть неудобство в некоторых сторонних программах. В частности, я использовал метод Crystal Reports ExportToStream. Как был написан этот метод, доступ к внутреннему буферу потока был запрещен. Чтобы отправить отчет в браузер, мне пришлось скопировать поток в новый буфер (100 КБ +), а затем отправить его. Установив для частного поля _exposable в объекте потока значение true, я смог напрямую отправить внутренний буфер, сохраняя выделение более 100 КБ для каждого запроса.
—
Ray
Зачем? Допустим, у вас есть частные сеттеры для ваших свойств Id для всего вашего объекта домена, и вы хотите реализовать тесты репозитория. Тогда только в вашем тестовом проекте репозитория вы захотите установить свойство Id.
—
bounav
Другой сценарий использования: установка автоматически сгенерированных полей, таких как «дата создания» при импорте данных.
—
ANeves
Другое почему. Мне просто любопытно, возможно ли это. Вот как я подошел к этому вопросу.
—
Калеб Мауэр,