Ограничение доступа к общедоступному сеттеру определенными объектами (C #) - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь создать класс (в C #), который служит средой для моего приложения.

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

Кажется, я не могу найти хороший способ сформулировать мой вопрос (который, как я полагаю, является одной из причин, по которой я не могу найти ничего подобного в Google или MSDN), но вкратце, I хочу создать класс с сеттерами, которые доступны только для некоторых моих объектов и не для всех .

В настоящее время я забавляюсь следующей идеей: Избегайте общедоступных сеттеров и открывайте приватные поля, используя регистрацию событий.

Класс будет регистрироваться для событий в новом третьем объекте (отправляется в качестве параметра конструктору). Методы, которые будут зарегистрированы средой, не намного больше, чем сеттеры, поэтому запуск этих событий «разрешит доступ» к закрытым полям.

Мне бы понравились некоторые идеи (учитывая, что я чувствую, что моя не так уж велика), или, что еще лучше, некоторые модели, которые я мог бы использовать.

Заранее спасибо

Ответы [ 6 ]

3 голосов
/ 14 октября 2010

Разве «внутреннего» недостаточно для того, что вам нужно?

И вы можете переместить сеттеры в интерфейс в качестве явной реализации.Затем они скрыты от общедоступного интерфейса и доступны только в том случае, если вы приведете к интерфейсу.

И если вы действительно хотите, чтобы никто другой не мог его вызвать, вы можете добавить какой-либо параметр в эти функции, где вы ожидаетеопределенный маркерный объект, который вы даете только доверенным классам.

void SetX(int value, object token)
{
    if(token!=correctToken)
        throw new ArgumentException("wrong token");
    x=value;
}
1 голос
/ 14 октября 2010

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

class MyClass
{
    public int MyProperty { get; set; }
}

class MyProxyClass
{
    public MyProxyClass(MyClass myClass)
    {
        _myClass = myClass;
    }

    private MyClass _myClass;

    public int MyProperty
    {
        get { return _myClass.MyProperty; }
    }
}
1 голос
/ 14 октября 2010

Вы можете попробовать использовать Friend сборки. Это позволит только указанным вами сборкам иметь доступ к вашим частным лицам (сникер).

0 голосов
/ 14 октября 2010

Почему бы не вернуть клоны ваших защищенных объектов вместо реальных объектов?Решает проблему, не добавляя больше сложности.

public class MyService
{
    private List<MyObject> _protectedObjects = new List<MyObject>();

    public MyObject GetItem(int id)
    {
        return (MyObject)_protectedObjects.First(i => i.Id == id).Clone();
    }
}

public class MyObject : ICloneable
{
     //[...]
     public object Clone()
     {
         return MemberwiseClone();
     }
}
0 голосов
/ 14 октября 2010

Как насчет

class Callee
{
    public void SetX(TypeOfCaller caller, int value)
    {
    }
}
class TypeOfCaller
{
    public void Do()
    {
        Callee instance;
        //..
        instance.SetX(this, 5);
    }
}

Делая так; Вы также можете использовать функцию поиска ссылок в Visual Studio! В случае, если вы хотите несколько типов абонента; Вы можете выбрать иерархию классов или просто иметь необходимые перегрузки

0 голосов
/ 14 октября 2010

Может быть, я что-то понял не очень хорошо, но, думаю, у Джона была довольно похожая проблема, которую он описал здесь . Может быть, это может помочь вам.

...