通过反射从类型继承

时间:2011-07-08 15:01:13

标签: c# inheritance reflection

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

参考log4net,我会:

using log4net.Core;

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

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

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

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

感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

你基本上不能。

听起来你应该把它提取到一个单独的项目中, 依赖于log4net,并有效地把它当作log4net本身的一个额外部分(与它一起版本等)。

答案 1 :(得分:3)

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

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

  1. 创建一个包含所有方法的接口,您需要从log2net和一些额外的跟踪方法。
  2. 在运行时创建此接口的实现,它将所有调用路由到log2net并进行必要的修改或跟踪
  3. 提供工厂方法以创建动态类的实例
  4. 但是,我很乐意稍后调试。

答案 2 :(得分:0)

我会说Reflection是一个运行时操作,其中继承是在编译期间执行的操作。您可能能够在CodeDom中执行某些操作并在运行时构建动态类,但我不确定它是否会为您提供所需的内容。

答案 3 :(得分:0)

如果要向log4net添加自定义级别,则不必编写代码; Just by using configuration您可以添加自己的级别

答案 4 :(得分:0)

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

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