Частично инкапсулировать поле C # - PullRequest
2 голосов
/ 24 октября 2009

Я хочу знать, есть ли шаблон, который может решить эту проблему: У меня есть набор свойств, которые должны быть общедоступными для нескольких классов, а для других классов они должны быть доступны только для чтения, классы должны быть общедоступными .

Я не хочу использовать рефлексию или других плохих исполнителей.

Я знаю, что могу сделать их RO и реализовать логику внутри класса, но я не думаю, что это хорошо.

Любая помощь?

Ответы [ 4 ]

8 голосов
/ 24 октября 2009

Внутри текущей сборки вы можете сделать это internal.

Вне текущей сборки лучшее, что вы можете сделать, это сделать ее доступной для определенных сборок через [InternalsVisibleTo].

.NET не предлагает более детализированный доступ "друзей".

7 голосов
/ 24 октября 2009
class Person : IReadOnlyPerson {
    public string Name { get; set; }
}

public interface IReadOnlyPerson {
    string Name { get; }
}

Для тех классов, которые должны делать r / o доступ - используйте IReadOlyPerson

2 голосов
/ 24 октября 2009

Два варианта:

  1. Сделать свойство внутренним (не классом) и сгруппировать классы в разные сборки.
  2. Используйте магию отражения.

К сожалению, в C # нет классов friend.

0 голосов
/ 24 октября 2009

Вы можете попытаться объявить ваши сеттеры защищенными в вашем базовом классе. Любой класс, который его выводит, сможет установить его. Но любой класс, использующий производный класс, увидит только свойство только для чтения.

public class ClassBase
{
    public int MyProperty
    {
        get;
        protected set;
    }
}

public sealed class ClassDerived : ClassBase
{
    public ClassDerived()
    {
        MyProperty = 4; // will set
    }
}

public class ClassUsingDerived
{
    public ClassUsingDerived()
    {
        ClassDerived drv = new ClassDerived();
        drv.MyProperty = 5; // will fail
    }
}

То есть, если я правильно понял вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...