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;
Другие вопросы по тегам