Защита доступа с автоматически внедряемыми свойствами в C # - PullRequest
0 голосов
/ 13 мая 2010

Простой пример. альтернативный текст http://img19.imageshack.us/img19/1854/51445300.jpg

A имеет класс TDMReader, который является булдиером объектов TDMFile, и я использую автоматически реализованные свойства, например,

    public string Name
    {
        get;
        set;
    }

    public Group[] Groups
    {
        get;
        set;
    }  

То, что я хочу сделать, это сделать setter доступным только для методов TDMReader. В C ++ у меня могли быть методы друзей для доступа к закрытым переменным, в Java я мог сделать их в одном пакете и, таким образом, получить доступ к полям. У меня есть некоторые идеи, но с этой автоматической реализацией немного сложнее. Любые идеи с конечным решением? :)

Ответы [ 2 ]

4 голосов
/ 13 мая 2010

Автоматические свойства не имеют к этому никакого отношения - те же параметры доступны для автоматических свойств и свойств "вручную". Вы можете ограничить доступ к сеттеру следующим образом:

// Setter access only to this type and nested types
public string Name { get; private set; }
// Setter access within the assembly
public Group[] Groups { get; internal set; }

и т.д.

... но вы не можете сделать это для одного класса (если этот класс не вложен в объявленный тип, в этом случае private будет в порядке). В .NET или C # нет доступа с ограниченным пространством имен.

(Не совсем понятно, в каком классе объявлены свойства - если они TdmReader, то просто сделайте их закрытыми. Если они TdmFile, у вас проблема, описанная выше.)

2 голосов
/ 13 мая 2010

Как это:

public string Name
{
    get;
    private set;
}

public Group[] Groups
{
    get;
    private set;
}  

При добавлении ключевого слова private сеттеры будут доступны только по коду из того же класса. Вы также можете добавить internal, чтобы сделать его доступным для кода в том же проекте.


Обратите внимание, что представление массива как свойства - очень плохой дизайн.
Вместо этого вы должны выставить Collection<Group> или ReadOnlyCollection<Group> в пространстве имен System.Collections.ObjectModel.

...