Установить специфическое c поведение доступа к члену - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно особое c поведение для доступа к моим классам, и хотя есть обходные пути, и я могу справиться с ситуацией, не добиваясь этого c поведения, я, наконец, задавался вопросом, возможно ли вообще этого достичь в c#.

Итак, у меня есть 3 связанных класса:

class Foo {
    public FooData fooData;

  }

  class FooData { //holding Foo class serializable part logic
    public Settings settings;


  }
  // needes to be public along with all its members for serialization
  [Serializable]
  public class Settings { 
    public int { get; set; };
    public int { get; set; };
    public int { get; set; };
  }
}

Эти 3 класса не обязательно должны быть вложенными, но рекурсивно храните и экземпляры каждого (надеюсь, что это имеет смысл). Под этим я подразумеваю, что Foo содержит поле FooData, а FooData содержит поле Settings.

То, что я хочу, - это конкретное поведение доступа c. Это означает, что я хочу иметь доступ к свойствам настроек из экземпляра Foo, назовем его «родительским классом» (хотя на данный момент наследование не задействовано). НО , что если я обрабатываю экземпляры класса Settings для тем сериализации, я хочу, чтобы доступ к свойствам Settings был запрещен (частное поведение).

Некоторый, надеюсь, понятный псевдокод:

  //With interfaces, I can expose the settings properties, 
  //so that I can get and set them direclty from the Foo instance. Thants fine
  Foo fooInstance = new Foo();
  fooInstance.int1 = 3; 
  int myInt = FooInstance.int1;

  Foo.Settings mySettings = new Settings();
  mySettings.int1; // ERROR. NO ACCESS FROM SETTINGS INSTANCE. I want this to be private, that you 
  //cannot access it from the settings 
  //instance, only from the Foo instance directly.
  fooInstance.Settings = mySettings; //the whole settings instance needs to be get and set as a 
  //whole, BUT settings variables should ONLY be possible to be accessed from Foo instance.

Ограничивающим фактором является то, что класс настроек должен быть опубликован c, потому что для тем сериализации мне нужно создать экземпляры этого где угодно. Кроме того, все его методы получения и установки свойств должны быть опубликованы c также из-за сериализации (доступ из любого места).

Мой вопрос в том, есть ли способ инкапсулировать доступность класса настройки intance чтобы оставить его и все его члены publi c, чтобы можно было сериализовать НО , чтобы ограничить доступ к свойствам настроек (а не ко всему экземпляру Settings), чтобы я мог получить и установить их ТОЛЬКО из мастер-класса Foo. Так что:

fooInstance.int1 = 3; //get or set from foo instance IS granted
fooInstance.settings.int1 = 3; //get or set from foo instance NOT granted

Я много чего пробовал с вложением классов и открытием частных свойств интерфейса et c, но, согласно моим исследованиям, этого достичь невозможно.

Резюме, если подсказка есть, хотя класс вместе со всеми его членами должен быть опубликован c (в моем случае класс настроек), может ли быть достигнуто частное поведение в некоторой степени по отношению к определенным классам или к внешнему миру, кроме определенных классов (сериализация класы, к которым нужен доступ) ?? (похоже на ключевое слово класса друга в C ++, с помощью которого вы можете настроить доступ к своим потребностям, я думаю).

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

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

Один обходной путь, о котором я думал, - это создать класс равных настроек со всеми его частными членами и установить его в классе foo с отражением или чем-то еще вот так (имеет ли это какой-то смысл?)

Несмотря на расширение и запутанность объяснения, надеюсь, что кто-то в сообществе сможет найти topi c достаточно интересным, чтобы добраться до конца, и dicover, возможно ли это, если да, то как и если нет, знать об ограничениях c#.

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

...