C# дать доступ к конкретному не связанному классу
Есть ли способ изменить доступ некоторого атрибута к определенному классу? Точнее говоря, я хочу создать свойство, которое имеет публичное получение, но может быть установлено только определенным классом.
Пример:
public Class1
{
Class2.SomeInt = 5;
}
public static Class2
{
private static int someInt;
public static int SomeInt
{
get { return someInt; }
(give access to Class1 only somehow?) set { someInt = value; }
}
}
Обновление (больше информации): я делаю это в xna, я хочу, чтобы основной тип (Game1) был единственным, что может модифицировать статический вспомогательный класс. Это для группового проекта в школе, мы используем SVN (не уверен, насколько это актуально), я мог бы просто сказать всем в моей группе избегать установки значений, но мне было интересно, есть ли лучший способ.
2 ответа
Это звучит как friend
модификатор доступа, которого нет у C#. Самое близкое, что я видел в C#, это чтобы "не связанный" класс был интерфейсом и имел частную реализацию внутри класса. Что-то вроде этого:
public interface IWidget
{
void DoSomethingPublic();
}
public class SomeObject
{
private ObjectWidget _myWidget = new ObjectWidget();
public IWidget MyWidget
{
get { return _myWidget; }
}
private class ObjectWidget
{
public void DoSomethingPublic()
{
// implement the interface
}
public void DoSomethingPrivate()
{
// this method can only be called from within SomeObject
}
}
}
Код, внешний по отношению к SomeObject
может взаимодействовать с MyWidget
и видит все, что на IWidget
интерфейс, но внутренний код SomeObject
также могут не взаимодействовать с публичными членами на MyWidget
,
Это кажется невозможным в C#. Вы можете использовать только public
, protected
, protected internal
, internal
а также private
модификаторы доступа.
Но вы можете, например, сделать сборку, которая содержит только эти два класса и установить internal
модификатор для SomeInt
установить или вложить один класс в другой.
Если вы хотите просто скрыть сеттер от IntelliSense, вы можете определить этот сеттер в некотором интерфейсе и реализовать его явно:
public interface IHidden<T>
{
T HiddenPropery { set; }
}
public class SomeClass : IHidden<int>
{
private int someInt;
public int HiddenPropery
{
get { return someInt; }
}
int IHidden<int>.HiddenPropery
{
set { someInt = value; }
}
}
Использование:
// This works:
((IHidden<int>)new SomeClass()).HiddenPropery = 1;
// This doesn't:
new SomeClass().HiddenPropery = 1;