2011-07-08 68 views
4

我正在开发一个log4net包装器,我必须从log4net.Core.LogImpl继承一个自定义类来提供TRACE级别。通过反射继承类型

随着到log4net的一个参考,我会:

using log4net.Core; 

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

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

- >我不能使用“使用log4net.Core”。

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

谢谢你的帮助!

+0

我不明白为什么你想要log4net版本的动态独立性。如果你想使用不同的版本,换出版本并重新编译。为什么要在不重新编译的情况下更换版本? –

回答

4

基本上,你不能。

这听起来像你可能要提取此到一个单独的项目,该项目确实依赖于log4net的,并有效地把它当作log4net的本身(版本在它旁边等)的额外部分。

+0

确实,IL注射技术对我的需求来说太痛苦了:我会在解决方案中添加一个依赖于版本的项目。 –

0

我会说Reflection是一个运行时操作,其中继承是在编译期间执行的操作。你可能可能能够做CodeDom的东西,并在运行时建立一个动态类,但我不知道它会给你你需要的。

3

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

所以,配方可能是这样的:

  1. 创建一个包含所有方法,您从log2net和一些额外的跟踪方法需要一个接口。
  2. 在运行时创建这个接口的实现,将路由所有呼叫与必要的修改log2net或跟踪
  3. 提供工厂方法来创建动态类的实例

不过,我would'd很高兴稍后进行调试。

0

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

但是,要使用动态加载的程序集,最好的方法是有一组定义良好的接口,然后可以使用它来引用动态加载的类型。你不通过继承扩展一个类,而是通过组合,使用诸如strategy这样的模式。