Наследовать от типа по отражению - PullRequest
4 голосов
/ 08 июля 2011

Я разрабатываю оболочку log4net, и я должен наследовать пользовательский класс от log4net.Core.LogImpl, чтобы обеспечить уровень TRACE.

Со ссылкой на log4net я бы получил:

using log4net.Core;

public class TraceLogImpl : LogImpl, ITraceLog
{
...
}

Проблема в том, что у меня не должно быть прямой ссылки на log4net.dll в моем проекте: библиотека находится в каталоге bin (таким образом, я не зависим от конкретной версии log4net), и она загружается во время выполнения.

-> Я не могу использовать "using log4net.Core".

Мой вопрос: как я могу наследовать от этого типа с помощью отражения?

Спасибо за вашу помощь!

Ответы [ 5 ]

4 голосов
/ 08 июля 2011

Вы не можете, в основном.

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

3 голосов
/ 08 июля 2011

Вы можете наследовать от класса во время выполнения, создавая динамическую сборку и вставляя в нее некоторый IL-код. Здесь - это пример библиотеки, которая наследуется от неизвестного интерфейса и известного класса во время выполнения.

Итак, рецепт может быть таким:

  1. Создайте интерфейс, содержащий все необходимые вам методы из log2net и некоторые дополнительные методы трассировки.
  2. Во время выполнения создайте реализацию этого интерфейса, которая будет направлять все вызовы log2net с необходимыми изменениями или трассировкой
  3. Предоставить фабричный метод для создания экземпляров динамического класса

Однако я был бы рад отладить это позже.

0 голосов
/ 08 июля 2011

Чтобы наследовать от класса с помощью отражения, ваш класс должен быть создан с помощью самого отражения.Взгляните на Reflection.Emit .

Но для работы с динамически загруженными сборками лучше всего иметь набор четко определенных интерфейсов, которые затем можно использовать для ссылки на динамически загруженныетипы.Вы расширяете класс не по наследству, а по композиции, используя что-то вроде шаблона стратегии .

0 голосов
/ 08 июля 2011

Если вы хотите добавить пользовательский уровень в log4net, вам не нужно писать код; Просто с помощью конфигурации вы можете добавить свои собственные уровни

0 голосов
/ 08 июля 2011

Я бы сказал, что Reflection - это действие во время выполнения, где в качестве наследования используется действие, выполняемое во время компиляции. Вы могли бы иметь возможность что-то делать с CodeDom и создавать динамический класс во время выполнения, но я не уверен, что он даст вам то, что вам нужно.

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