Вы можете просто добавить set
, и он будет работать нормально:
public IValue Value { get; set; }
Таким образом, вы можете установить значение, если у вас есть Foo
, но не если у вас есть IFoo
.Аналогично случаю C ++, если у вас есть IFoo
, вы можете привести к Foo
(при условии, что объект фактически равен Foo
), а затем использовать установщик.
Другой вариант - сделатьsetter protected
или private
:
public IValue Value { get; private set; }
Это позволяет вам убедиться, что только код в этом классе (или унаследованный класс * protected
) может установить свойство.
Относительно internal
: да, он предоставляет члену только код в той же сборке (и дружественных сборках).Но это используется не очень часто.Используются (и полезны) внутренние типы, которые даже используются по умолчанию, если вы не укажете, что этот класс public
.
Это может помочь вам в вашей проблеме.Если вы сделаете Foo
internal
, метод в другой сборке с IFoo
не сможет установить свойство, даже с приведением.
Конечно, код всегда может использовать отражение дляустановить свойство.Но вы не должны беспокоиться об этом большую часть времени.