Разоблачение внутреннего класса как публичной собственности - PullRequest
2 голосов
/ 01 июня 2011

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

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 ]

6 голосов
/ 01 июня 2011

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

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

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

2 голосов
/ 01 июня 2011

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

2 голосов
/ 01 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...