首页 > 编程语言 >不同程序集,名称空间类名和方法签名都一样的方法,如何调用

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

时间:2023-02-21 08:57:41浏览次数:46  
标签:调用 ClassLibrary2 方法 程序 dotnet Where Example 类名 ClassLibrary1

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

创建两个不同的程序集

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

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 扩展中加入了同样的方法签名,然后你就会遇到这个问题。

总结

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

参考

感谢阅读,如果觉得本文有用,不妨点击推荐

标签:调用,ClassLibrary2,方法,程序,dotnet,Where,Example,类名,ClassLibrary1
From: https://www.cnblogs.com/newbe36524/p/0x022-how-to-call-a-method-with-the-same-method-signa

相关文章

  • 不同程序集,名称空间类名和方法签名都一样的方法,如何调用
    有时候,你可能会遇到这样的问题,不同程序集,名称空间类名和方法签名都一样的方法,如何调用。本文将介绍如何通过别名的方式来解决这个问题。创建两个不同的程序集我们来创建......
  • 在python中将4维数组中获取3维数组的方法
    在python中将4维数组中获取3维数组的方法得到了这个数组,它的大小是(26,16,16,16)。我需要绘制最后3个维度与不同参数的关系图,但我不清楚如何在不造成灾难的情况下切割第一个......
  • Java基础——方法
    packagecom.zhao.demo;publicclassDemo07{/*publicstaticvoidmain(String[]args){//getSum(10,20);//实参inta=10;......
  • 数组的reduce方法 - 累积运算
    参数描述function(total,currentValue,index,arr)必需。用于执行每个数组元素的函数。函数参数:参数描述total必需。初始值,或者计算结束后的返回值。curr......
  • 积化和差与和差化积的一种记忆方法
    之前对积化和差与和差化积的公式死活记不住,在细致观察公式的结构之后,认为通过这个方法去记忆效果会比较好,当然,这个方法也并非直接把公式记住,而是记住了公式的推导方法。首......
  • 数据类型----数值型内置方法
    一、引子数据类型是用来记录事物状态的,而事物的状态是不断变化的(如:一个人年龄的增长(操作int类型),单个人名的修改(操作str类型),学生列表中增加学生(操作list类型)等),这意味着......
  • pytorch中学习率的调整方法
    一、手动法二、利用lr_scheduler()提供的集中衰减函数2.1利用lr_lambda函数具体使用:fromtorch.optimimportSGD,lr_schedulerimportmatplotlib.pyplotaspltfro......
  • 由于找不到mfc140u.dll,无法继续执行代码的解决方法
    下载dll丢失文件第一步打开电脑浏览器上方输入【​​dll修复程序.site​​】进入后点击安装dll文件点击下载mfc140u.dll文件;下载好了需要进行解压。然后打开后点击开始检测,......
  • 数据类型-列表list-内置方法
    定义在[]内,用逗号分隔开多个任意数据类型的值l1=[1,'a',[1,2]]#本质:l1=list([1,'a',[1,2]])类型转换但凡能被for循环遍历的数据类型都可以传给list()转换成......
  • 数据类型-字符串-内置方法
    一、定义在单引号\双引号\三引号内包含一串字符name1='jason' #本质:name=str('任意形式内容')name2="lili" #本质:name=str("任意形式内容")name3=......