在程序集级别替换类,以便所有引用都调用新的实现

joh*_*y 5 5 c# castle-dynamicproxy .net-assembly

我想在程序集级别替换一个类,以便所有引用都调用新的实现。可以说我在整个项目中的程序集中使用了通用类,例如

System.Generic.Collections.List

我的项目也引用了其他依赖的程序集List

现在假设我想使用我的版本“ ListWhereever this is called”。

var values = new List<int> { 1, 2, 3, 4, 5 }
Run Code Online (Sandbox Code Playgroud)

如何在程序集级别替换类,以便我不必更新代码中的任何引用,或者可以在单个位置完成它。

我记得有元数据伙伴类和类似的东西是否可以使用全局编译指示进行覆盖?我依稀记得使用这样的语法:System.Generic.Collections.List::MyAssembly.List

我想以一种duck-typed底层类不必继承原始类的方式替换它,但我应该以相同的方式公开所有方法

注意:我需要以全局方式解决这个问题,通过反射或配置的单个入口点。

我过去已经做过动态替换方法的事情,请参阅:Dynamically Append Code to a method .Net-Core

Tar*_*zed 0

这将导致维护混乱和令人头疼的问题。据我所知,与您要求的最接近的是using alias.

using MyList = System.Generic.Collections.List<int>;
Run Code Online (Sandbox Code Playgroud)
MyList fooList = new MyList();  // This creates a System.Generic.Collections.List<int>
Run Code Online (Sandbox Code Playgroud)

但是,我的建议是尽可能为您的类使用不同的名称。它更加清晰并且使您的代码易于维护。在未来的某个地方,某人(可能是您)会看到您的列表不是 System.Generic.Collections.List 并且会感到非常困惑。

但是,您可以让自定义列表实现 IList,这是首选方法。

  • @johnny5 我明白了,据我所知,我认为这是不可能的,而且我认为如果是的话,这可能会是一个巨大的安全缺陷。这将为代码注入打开大门。 (2认同)