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

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

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

创建两个不同的程序集

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

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

修改他们的 RootNamespace 为 Example:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>Example</RootNamespace>
  </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>ClassLibrary1</Aliases>
    </ProjectReference>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj">
      <Aliases>ClassLibrary2</Aliases>
    </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 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

总结

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

参考

感谢您的阅读,如果您觉得本文有用,快点击下方点赞按钮👍,让更多的人看到本文。

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


  1. https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/extern-alias?WT.mc_id=DX-MVP-5003606
目录
相关文章
|
Windows
怎么让鼠标带黄色光圈?
怎么让鼠标带黄色光圈?
1658 0
怎么让鼠标带黄色光圈?
|
6月前
|
JSON 分布式计算 DataX
【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute
本文介绍使用崖山适配的DataX工具进行数据库迁移的方法,包括单表迁移和批量表迁移。单表迁移需配置json文件并执行同步命令;批量迁移则通过脚本自动化生成json配置文件并完成数据迁移,最后提供数据比对功能验证迁移结果。具体步骤涵盖连接信息配置、表清单获取、json文件生成、数据迁移执行及日志记录,确保数据一致性。相关工具和脚本简化了复杂迁移过程,提升效率。
|
机器学习/深度学习 人工智能 自然语言处理
Transformer介绍
Transformer模型于2017年由Google提出,其在BERT中大放异彩,革新了NLP领域。Transformer的优势在于并行计算能力和处理长距离依赖,通过自注意力机制避免了RNN/LSTM的梯度问题。它由编码器和解码器组成,使用位置编码处理序列信息。Transformer在机器翻译、文本生成、问答系统等多个任务中提升效率和准确性,并扩展至计算机视觉和语音识别。随着AI发展,Transformer成为大模型核心技术,推动整个产业进步。
|
10月前
|
人工智能 搜索推荐
阿里云亮相白鲸出海全球流量大会,为出海企业提供一站式通信解决方案
阿里云亮相白鲸出海全球流量大会,为出海企业提供一站式通信解决方案
307 9
|
消息中间件 Kubernetes Kafka
iLogtail 开源两周年:社区使用调查报告
iLogtail 两周年之际,iLogtail 团队针对开源社区进行了一次使用调研,用户的反馈异常宝贵,为 iLogtail 策略制定与优化提供了第一手的洞察力。点击本文即可查看调研关键要点,欢迎更多的开发者一同来塑造项目的未来。
352 82
|
11月前
|
网络协议 网络性能优化 API
TCP或RDMA
【10月更文挑战第1天】TCP或RDMA
475 2
|
人工智能 弹性计算 自动驾驶
2023 AI开发者生态报告:技术生态、开发范式与应用案例全景
随着人工智能技术的飞速发展,全球IT市场对AI的投入持续增长,预计到2027年将达到4236亿美元。
|
JavaScript 前端开发 PHP
什么是单点登录,单点登录的逻辑,思路,
什么是单点登录,单点登录的逻辑,思路,
453 0
|
安全 Java
Java多线程对于成员变量和局部变量的影响
Java多线程对于成员变量和局部变量的影响
|
图形学
【unity小技巧】unity3d创建和实现破碎打破物品,万物可破碎
【unity小技巧】unity3d创建和实现破碎打破物品,万物可破碎
821 0
【unity小技巧】unity3d创建和实现破碎打破物品,万物可破碎