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



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

System.Generic.Collections.List

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

现在假设我想使用我的List版本

var values = new List<int> { 1, 2, 3, 4, 5 }

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

我记得有元数据好友类和类似的东西是可能的覆盖使用全局pragma?我模糊地记得使用这样的语法:System.Generic.Collections.List::MyAssembly.List

我想用duck-typed方式替换它,其中底层类不一定要从原始类继承,但我应该以相同的方式暴露所有方法

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

我过去已经做过动态替换方法的事情,参见:动态地将代码附加到方法。net - core

不是什么好办法,但这里有一个解决办法。

// MyAssembly.dll
namespace MyNamespace
{
public class MyList<T> : List<T>
{
// Your custom implementation
}
}

和这样的解析器

using System.Reflection;
using System.Runtime.Loader;
public class CustomAssemblyResolver : AssemblyLoadContext
{
protected override Assembly Load(AssemblyName assemblyName)
{
// Check if the requested assembly is the target assembly
if (assemblyName.Name == "System.Generic.Collections.List")
{
// Load your custom assembly and return it
return LoadFromAssemblyPath("path/to/MyAssembly.dll");
}

// Fallback to the default behavior
return Default.LoadFromAssemblyName(assemblyName);
}
}

并注册:

using System.Runtime.Loader;
static void Main(string[] args)
{
// Register the custom assembly resolver
var customResolver = new CustomAssemblyResolver();
AssemblyLoadContext.Default.Resolving += (context, assemblyName) => customResolver.Load(assemblyName);

// Your application code
}

这将导致维护混乱和头痛。我所知道的最接近你要求的东西是using alias

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

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

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

相关内容

  • 没有找到相关文章

最新更新