Если ваша цель - иметь класс Foo
, то пусть какое-то свойство (например, Bar
, типа Biz
) будет изменено каким-либо другим объектом, без публичного раскрытия, простой способ сделать это - иметь экземпляр Foo
, который должен быть изменен другим объектом для передачи этому другому объекту Action<Biz>
, который указывает на закрытый метод, который изменяет Bar
на переданное значение. Другой объект может использовать этот делегат для изменения значения Bar
объекта, который его предоставил.
Если кто-то желает дать всем экземплярам какого-либо типа Woozle
возможность установить значение Bar
для любого экземпляра Foo
, вместо того, чтобы предоставлять такие способности для каждого экземпляра, можно потребовать, чтобы Woozle
имеет открытый статический метод Woozle.InstallFooBarSetter
, который принимает параметр типа Action<Foo, Biz>
и один тип Object
. Foo
должен иметь статический метод WoozleRequestBarSetter
, который принимает Object
и передает его в Woozle.InstallFooBarSetter
вместе с Action<Foo,Biz>
. Инициализатор класса для Woozle
должен сгенерировать новый Object
и передать его в Foo.RequestBarSetter
; который передаст объект в Woozle.InstallFooBarSetter
вместе с делегатом. Woozle
может затем подтвердить, что переданный объект является тем, который он сгенерировал, и - если это так - установить соответствующий делегат. Поступив таким образом, вы гарантируете, что никто, кроме Woozle
, не сможет получить делегата (поскольку делегат передается только Woozle.InstallFooBarSetter
), а Woozle
может быть уверен, что его делегат получен из Foo
(поскольку никто другой не будет иметь доступа к объекту, который Woozle
создал, и Woozle.InstallFooBarSetter
ничего не сделает без него).