Как определить структуру, члены которой могут быть доступны любым внутренним классам, но могут быть установлены только определенным (внутренним) классом? - PullRequest
2 голосов
/ 22 июля 2010

Как определить структуру, члены которой могут быть доступны любым внутренним классам через свойства, но могут быть установлены только определенным внутренним классом? (Если это возможно.)

Если это невозможно, есть ли работа по выполнению аналогичного требования?

Редактировать 1: ниже

Причина:

У меня есть класс A с двумя членами _x и _arrB. _x может быть прочитано, но не изменено внутренними классами (кроме класса A) до x.

Я также хочу разрешить внутренним классам читать элементы structB в _arrB и читать члены этих structB. Но я только хочу, чтобы класс A мог изменять либо элемент structB в _arrB, либо член этих structB. Поэтому я думаю, что мне нужна структура, которая может указывать, какие внутренние классы могут изменять его член. [1]

class A 
{
    private int _x;
    internal int x
    {
        private set
        {
            _x = value / 2;
        }
        internal get
        {
            return _x * 2;
        }
    }

    private B[] _arrB;
    internal B[] arrB
    { 
        private set
        {
            _arrB = value;
        }
        internal get
        {
            return _arrB;
        }
    }

    public A() 
    {
        _x = //value read from somewhere;            

        //do something to determine size
        _arrB = new B[size];
        //populate _arrB
        ...
    }


}

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

[1] Однако, _arrB - это массив, который является объектом, который является ссылочным типом. Когда внутренний класс получает ссылку на _arrB, элементы structB могут быть изменены без контроля. Я понял, что не хочу, чтобы внутренние классы устанавливали для _arr [0] значение null. Поэтому любое решение должно учитывать это.

Я подумаю об этом до конца дня и опубликую решение, когда я подумаю об этом.

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Интересно, почему ты так хочешь?AFAIK возможны только уродливые хаки.

НАЧАЛО ПРЕДУПРЕЖДЕНИЯ: не читайте, если вам не нравится уродливый код !!!

Что сказал Дэвид Нил .

Вы можете поместить их в отдельные сборки и установить их в дружественные:

[assembly:InternalsVisibleToAttribute("assembly name", "key")]

Вы можете создать класс следующим образом:

internal struct ModifiedStruct
{
    public int Value {get; private set; }

    internal class ModifyingClass
    {
        public void ModifyValue()
        {
            ModifiedStruct s = new ModifiedStruct();
            s.Value = 456;
        }
    }

}

END WARNING

Редактировать (вопрос изменен) Чтобы запретить изменение коллекции, используйте ReadOnlyCollection Class .

internal ReadOnlyCollection<B> BCollection
{
    get
    {
        return new ReadOnlyCollection<B>(_arrB);
    }
}
1 голос
/ 22 июля 2010

Единственное, о чем я могу думать, - это использовать трассировку стека для получения кадра вызова, затем вызывающего метода, а затем отраженного типа этого метода. Затем вы можете проверить, какой тип вы ожидаете.

РЕДАКТИРОВАТЬ, ПРЕДУПРЕЖДЕНИЕ, ПЛОХОЙ КОД:

StackTrace oStack = new StackTrace(true);

string callingType = oStack.GetFrame(1).GetMethod().ReflectedType.FullName;

if(callingType != "MyAcceptableClass")
    throw new MethodAccessException(
          callingType + " is not allowed to call this method");

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

0 голосов
/ 23 февраля 2012

Если возможно создать структуру с определенными значениями в ее полях, то любое изменяемое хранилище этого типа структуры может быть изменено для хранения этих значений, создав экземпляр с этими значениями, а затем скопировав этот экземпляр в хранилище.обсуждаемый.Сказать struct1=struct2 эквивалентно высказыванию struct1.field1 = struct2.field1; struct1.field2 = struct2.field2; и т. Д. Для всех полей, открытых и закрытых, типа struct.

...