У меня есть контейнерный класс Foo<TInterface>
, который принимает параметр произвольного типа интерфейса и строку "strCode" в своем конструкторе.
После создания экземпляра Foo strCode компилируется с помощью CSharpCodeProvider, и через Reflection соответствующий тип располагается во вновь скомпилированном коде, затем приводится к типу TInterface и поднимается в Foo до свойства TInterface bar.
Это работает нормально, и клиент может получить доступ к foo.bar без проблем. Однако Foo также содержит (среди прочих методов) метод с именем Recompile, который в основном принимает и компилирует новую строку кода вышеупомянутым способом. Это также хорошо работает, но это означает, что клиент в конечном итоге использует API Foo, где методы организованы примерно так:
foo.bar.MakeCoffee
foo.bar.DoMagic
foo.Recompile
Я бы предпочел:
foo.MakeCoffee
foo.DoMagic
foo.Recompile
Другими словами, я хотел бы вернуть экземпляр класса с доступом на верхнем уровне как к универсальным методам интерфейса, так и к методам API Foo.
В идеале было бы неплохо вернуть экземпляр Foo<TInterface>
, но я понимаю, что дженерики C # не допускают этого. Я был бы рад опубликовать код, если это необходимо, но сначала хочу убедиться, что я не лаю неправильное дерево из-за статической природы типов C #.