Представление внутреннего класса как публичного свойства


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

public class TheOriginalClass
{
    public MyInternalClass InternalClassProperty { get; set; }
}

// It doesn't make sense to use this by itself
internal class MyInternalClass
{
    public string InterestingProperty { get; set; }
}

В идеале, я хотел бы инкапсулировать эти вспомогательные классы в сборке, поскольку для них нет смысла создавать экземпляры где-либо еще.

Есть ли способ достичь этого?
3 2

3 ответа:

Если вы открываете содержимое класса внешнему миру, отметьте его как public, чтобы позже вы знали, что класс является общедоступным, поэтому вы не будете так часто менять открытый интерфейс. Нет смысла отмечать его internal, если он не будет таким внутренним.

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

Не имеет смысла иметь класс internal в качестве статического типа свойства public. Потребитель этого свойства в другой сборке не смог бы сделать с ним ничего полезного.

Возможно, вы хотели иметь вспомогательный класс public с конструктором internal, чтобы предотвратить его создание другими.

Или сделать тип свойства открытым интерфейсом и реализовать этот интерфейс во внутреннем классе.

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