• 不同程序集,名称空间类名和方法签名都一样的方法,如何调用


    有时候,你可能会遇到这样的问题,不同程序集,名称空间类名和方法签名都一样的方法,如何调用。本文将介绍如何通过别名的方式来解决这个问题。

    创建两个不同的程序集

    我们来创建两个不同的程序集,但是他们的名称空间一样:

    dotnet new classlib -o ClassLibrary1 -n ClassLibrary1
    dotnet new classlib -o ClassLibrary2 -n ClassLibrary2

    修改他们的 RootNamespace 为 Example:

    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <TargetFramework>net7.0TargetFramework>
    <RootNamespace>ExampleRootNamespace>
    PropertyGroup>
    Project>

    然后,我们在两个程序集中都创建一个类,类名也一样,并且添加一个自定义 Where 扩展方法:

    namespace Example
    {
    public static class LinqExtensions
    {
    public static void Where(IEnumerable<int> source)
    {
    // 在这里添加代码
    Console.WriteLine("ClassLibrary1.Class1.Where");
    }
    }
    }

    创建一个控制台应用

    然后,我们创建一个控制台应用,来调用这两个程序集中的 Where 方法:

    dotnet new console -o ConsoleAppShi -n ConsoleAppShi
    dotnet add ConsoleAppShi reference ClassLibrary1
    dotnet add ConsoleAppShi reference ClassLibrary2

    然后,我们在控制台应用中调用这两个程序集中的 Where 方法:

    using Example;
    var list = new int[]{1,2,3};
    LinqExtensions.Where(list);

    如果是这样的话,我们会得到这个错误:

    Ambiguous reference: Example.LinqExtensions Example.LinqExtensions match

    通过别名的方式来解决

    我们可以通过别名的方式来解决这个问题,首先修改项目文件,设置两个程序集的别名:

    <Project Sdk="Microsoft.NET.Sdk">
    <ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
    <Aliases>ClassLibrary1Aliases>
    ProjectReference>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj">
    <Aliases>ClassLibrary2Aliases>
    ProjectReference>
    ItemGroup>
    Project>

    然后,我们在控制台应用中调用这两个程序集中的 Where 方法:

    extern alias ClassLibrary1;
    extern alias ClassLibrary2;
    var list = new[] { 1, 2, 3 };
    ClassLibrary1::Example.LinqExtensions.Where(list);
    ClassLibrary2::Example.LinqExtensions.Where(list);

    运行就会得到这样的结果:

    ClassLibrary1.Class1.Where
    ClassLibrary2.Class1.Where

    为什么会有这种问题

    一般来说你会在三种情况下遇到这个问题:

    1. 某个开源项目使用 ILmerge 把多个程序集合并成一个程序集。其中一个依赖项 A 恰好也是你的依赖项,但是 A 的版本和开源项目的依赖项 A 的版本不一样,这时候你就会遇到这个问题。
    2. 很早之前 Rx.net 正对 System.Linq.Async 进行了支持,而后来系统也内置了 System.Linq.Async。你会在使用 Rx.net 的时候遇到这个问题。
    3. 你的同事想考验你一下,估计把自己写的 Sqlite 扩展和 MSSQL 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

    总结

    通过别名的方式,我们可以解决不同程序集,名称空间类名和方法签名都一样的方法,如何调用的问题。

    参考

    感谢阅读,如果觉得本文有用,不妨点击推荐👍或者在评论区留下 Mark,让更多的人可以看到。

    欢迎关注作者的微信公众号“newbe技术专栏”,获取更多技术内容。 关注微信公众号“newbe技术专栏”


    1. https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/extern-alias?WT.mc_id=DX-MVP-5003606

  • 相关阅读:
    对于工作中复杂的业务,使用mabatis-plus加分页插件的话,有时候得不到自己想要的
    Codeforces Round #684 (Div. 1)
    测一测现在的温度
    【python技巧】替换文件中的某几行
    LeetCode热题100 【cpp】题解(一)哈希表和双指针
    单目标应用:基于狐猴优化算法(Lemurs Optimizer,LO)的微电网优化调度MATLAB
    Git学习笔记
    Linux虚拟机 & Docker 安装 RabbitMQ
    Codeforces Global Round 21 C. Fishingprince Plays With Array
    前端面试宝典React篇10 与其他框架相比,React 的 diff 算法有何不同?
  • 原文地址:https://www.cnblogs.com/newbe36524/p/0x022-how-to-call-a-method-with-the-same-method-signature-in-different-assemblies.html