反射继承一个类型

4

我正在开发一个log4net包装器,需要继承一个自定义类从而提供TRACE级别的日志。

引用了log4net后,代码如下:

using log4net.Core;

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

问题在于我的项目中不能直接引用log4net.dll:该库位于bin目录中(这样,我就不依赖于特定版本的log4net),并且在运行时加载。
-> 我不能使用“using log4net.Core”。
我的问题是:如何通过反射从这个类型继承?
谢谢您的帮助!

我不明白为什么您要log4net版本的动态独立性。如果您想使用不同的版本,请更换版本并重新编译。为什么您希望在不重新编译的情况下能够交换版本? - Kirk Woll
5个回答

4
基本上你无法做到。
听起来你可能需要将这个功能提取出来,创建一个独立的项目,它应该依赖于log4net,并有效地将其视为log4net本身的额外部分(与其一起进行版本控制等)。

是的,IL注入技术对我的需求来说太过繁琐了:我将在我的解决方案中添加一个版本相关的项目。 - L. Ventre

3

你可以通过创建动态程序集并向其中注入一些IL代码来在运行时从一个类继承,这里 是一个库的示例,它在运行时从一个未知接口和已知类继承。

因此,步骤可能如下:

  1. 创建一个接口,其中包含您从log2net中需要的所有方法和一些额外的跟踪方法。
  2. 在运行时创建该接口的实现,该实现将对log2net进行所有调用所需的修改或跟踪路由。
  3. 提供工厂方法以创建动态类的实例。

但是,我很乐意稍后调试它。


1

使用反射继承一个类,你的类必须通过反射本身创建。请参考Reflection.Emit

但是,要处理动态加载的程序集,最好的方法是拥有一组明确定义的接口,然后可以使用这些接口引用动态加载的类型。你不是通过继承来扩展一个类,而是通过组合,使用类似strategy模式的东西。


0
我认为反射是在运行时执行的操作,而继承是在编译期间执行的操作。你可能能够使用CodeDom,在运行时构建一个动态类,但我不确定它是否能给你所需的结果。

0
如果您想要在log4net中添加自定义级别,您不需要编写代码;只需使用配置即可添加自己的级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接