C#. Запретить создание экземпляра вложенного класса?

Ситуация в вакууме:

<font color="black"><font color="#0000ff">class</font> Program<br/>
{<br/>
  <font color="#0000ff">static</font> <font color="#0000ff">void</font> Main()<br/>
  {<br/>
    MyClass.NestedClass t1 = MyClass.New(); <font color="#008000">// ОК</font><br/>
    MyClass.NestedClass t2 = <font color="#0000ff">new</font> MyClass.NestedClass(); <font color="#008000">// Не должно компилироваться! Как сделать?</font><br/>
  }<br/>
}<br/>
<br/>
<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">class</font> MyClass<br/>
{<br/>
  <font color="#0000ff">public</font> <font color="#0000ff">static</font> NestedClass New()<br/>
  {<br/>
    <font color="#0000ff">return</font> <font color="#0000ff">new</font> NestedClass();<br/>
  }<br/>
<br/>
  <font color="#0000ff">public</font> <font color="#0000ff">sealed</font> <font color="#0000ff">class</font> NestedClass {}<br/>
}</font><br/>
<br/>
<font color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font color="gray">Source Code Highlighter</font></a>.</font>


Как запретить создание экземпляра вложенного класса всем, кроме содержащего этот вложенный класс класса? Вроде даже паттерн был такой, или атрибут есть, да всё я забыл…
  • Вопрос задан
  • 3820 просмотров
Решения вопроса 1
VenomBlood
@VenomBlood
Конкретно в случае статического внешнего класса можно сделать следующее:

Параметры в конструктор добавить по вкусу.
public static class MyClass
{
    private static Func<NestedClass> _nestedClassFactory;

    public static NestedClass New()
    {
        return _nestedClassFactory();
    }

    public sealed class NestedClass
    {
        private NestedClass()
        {

        }

        static NestedClass()
        {
            _nestedClassFactory = () => new NestedClass();
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Weageoo
@Weageoo Автор вопроса
[System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert)]. Разве это не работает сейчас?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы