我正在开发一个log4net包装器,我必须从log4net.Core.LogImpl继承一个自定义类以提供TRACE级别。
参考log4net,我会:
using log4net.Core;
public class TraceLogImpl : LogImpl, ITraceLog
{
...
}
问题是我必须在我的项目中没有直接引用log4net.dll:库位于bin目录中(这样,我不依赖于特定版本的log4net)并且它在运行时加载。
- >我不能使用“使用log4net.Core”。
我的问题是:如何通过反射来继承这种类型?
感谢您的帮助!
答案 0 :(得分:4)
你基本上不能。
听起来你应该把它提取到一个单独的项目中, 依赖于log4net,并有效地把它当作log4net本身的一个额外部分(与它一起版本等)。
答案 1 :(得分:3)
您可以通过创建动态程序集并在其中注入一些IL代码,在运行时从类继承。 Here是库的一个示例,它在运行时从未知接口和已知类继承。
所以,配方可能是这样的:
但是,我很乐意稍后调试。
答案 2 :(得分:0)
我会说Reflection是一个运行时操作,其中继承是在编译期间执行的操作。您可能能够在CodeDom中执行某些操作并在运行时构建动态类,但我不确定它是否会为您提供所需的内容。
答案 3 :(得分:0)
如果要向log4net添加自定义级别,则不必编写代码; Just by using configuration您可以添加自己的级别
答案 4 :(得分:0)
要使用反射从类继承,必须通过反射本身创建类。看看Reflection.Emit。
但是,要使用动态加载的程序集,最好的方法是使用一组定义良好的接口,然后可以使用它们来引用动态加载的类型。您不是通过继承扩展类,而是通过组合扩展类,使用strategy模式。