关于c#:不同程序集名称空间类名和方法签名都一样的方法如何调用

33次阅读

共计 2155 个字符,预计需要花费 6 分钟才能阅读完成。

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

创立两个不同的程序集

咱们来创立两个不同的程序集,然而他们的名称空间一样:

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 扩大中退出了同样的办法签名,而后你就会遇到这个问题。

总结

通过别名的形式,咱们能够解决不同程序集,名称空间类名和办法签名都一样的办法,如何调用的问题。

参考

  • extern alias (C# Reference)1

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

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

  • 本文作者:newbe36524
  • 本文链接:https://www.newbe.pro/Others/0x022-how-to-call-a-method-with-the-same-method-signature-in-different-assemblies/
  • 版权申明:本博客所有文章除特地申明外,均采纳 BY-NC-SA 许可协定。转载请注明出处!

  1. https://learn.microsoft.com/d… ↩

正文完
 0