我正在开发log4net包装器,我必须从log4net. core继承一个自定义类。LogImpl提供TRACE级别。
对于log4net的引用,我将有:
using log4net.Core;
public class TraceLogImpl : LogImpl, ITraceLog
{
...
}
问题是,我必须在我的项目中没有直接引用log4net.dll:库在bin目录中(这样,我不依赖于log4net的特定版本),它是在运行时加载的。
->我不能使用"using log4net.Core"
我的问题是:我如何通过使用反射继承这种类型?
谢谢你的帮助!
基本上不能。
听起来好像你应该把它提取到一个单独的项目中,其中确实依赖于log4net,并有效地将其视为log4net本身的额外部分(与其一起进行版本控制等)。
通过创建动态程序集并向其中注入一些IL代码,可以在运行时继承类。下面是一个库的例子,它在运行时继承了一个未知的接口和已知的类。
那么,配方可能是这样的:
- 创建包含所有方法的接口,你需要从log2net和一些额外的跟踪方法。
- 在运行时创建此接口的实现,它将通过所需的修改或跟踪将所有调用路由到log2net
- 提供工厂方法创建动态类 的实例
但是,我很乐意以后调试这个
要使用反射从类继承,必须通过反射本身创建类。看一下Reflection.Emit.
但是,要使用动态加载的程序集,最好的方法是拥有一组定义良好的接口,然后可以使用这些接口来引用动态加载的类型。您不是通过继承来扩展类,而是通过组合来扩展类,使用类似于策略模式的东西。
我会说反射是一个运行时操作,而继承是在编译期间执行的操作。你可能能够用CodeDom做一些事情,并在运行时构建一个动态类,但我不确定它会给你你需要的。
如果你想添加一个自定义级别到log4net,你不必编写代码;只需使用配置,您就可以添加自己的级别