写点什么

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

作者:newbe36524
  • 2023-02-21
    上海
  • 本文字数:1519 字

    阅读完需:约 5 分钟

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

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

创建两个不同的程序集

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


dotnet new classlib -o ClassLibrary1 -n ClassLibrary1dotnet 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 ConsoleAppShidotnet add ConsoleAppShi reference ClassLibrary1dotnet 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.WhereClassLibrary2.Class1.Where
复制代码

为什么会有这种问题

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


  1. 某个开源项目使用 ILmerge 把多个程序集合并成一个程序集。其中一个依赖项 A 恰好也是你的依赖项,但是 A 的版本和开源项目的依赖项 A 的版本不一样,这时候你就会遇到这个问题。

  2. 很早之前 Rx.net 正对 System.Linq.Async 进行了支持,而后来系统也内置了 System.Linq.Async。你会在使用 Rx.net 的时候遇到这个问题。

  3. 你的同事想考验你一下,估计把自己写的 Sqlite 扩展和 MSSQL 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

总结

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

参考


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


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


发布于: 刚刚阅读数: 3
用户头像

newbe36524

关注

开源项目作者,独立博客维护者 2020-06-02 加入

newbe36524 是一名开发工程师。newbe 是 newbe36524 的个人技术博客。秉承 now everyone will be excellent 的 slogan 希望为开发者们分享自己的开发经验和心路历程。

评论

发布
暂无评论
不同程序集,名称空间类名和方法签名都一样的方法,如何调用_C#_newbe36524_InfoQ写作社区