通过反射从类型继承

本文关键字:类型 继承 反射 | 更新日期: 2023-09-27 18:01:38

我正在开发log4net包装器,我必须从log4net. core继承一个自定义类。LogImpl提供TRACE级别。

对于log4net的引用,我将有:

using log4net.Core;
public class TraceLogImpl : LogImpl, ITraceLog
{
...
}

问题是,我必须在我的项目中没有直接引用log4net.dll:库在bin目录中(这样,我不依赖于log4net的特定版本),它是在运行时加载的。

->我不能使用"using log4net.Core"

我的问题是:我如何通过使用反射继承这种类型?

谢谢你的帮助!

通过反射从类型继承

基本上不能。

听起来好像你应该把它提取到一个单独的项目中,其中确实依赖于log4net,并有效地将其视为log4net本身的额外部分(与其一起进行版本控制等)。

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

那么,配方可能是这样的:

  1. 创建包含所有方法的接口,你需要从log2net和一些额外的跟踪方法。
  2. 在运行时创建此接口的实现,它将通过所需的修改或跟踪将所有调用路由到log2net
  3. 提供工厂方法创建动态类
  4. 的实例

但是,我很乐意以后调试这个

要使用反射从类继承,必须通过反射本身创建类。看一下Reflection.Emit.

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

我会说反射是一个运行时操作,而继承是在编译期间执行的操作。你可能能够用CodeDom做一些事情,并在运行时构建一个动态类,但我不确定它会给你你需要的。

如果你想添加一个自定义级别到log4net,你不必编写代码;只需使用配置,您就可以添加自己的级别