如何在c#中调用特定的命名空间函数

本文关键字:命名空间 函数 调用 | 更新日期: 2023-09-27 18:02:07

目前,我有两个来自同一库的函数,在我的情况下都可以调用。如何指定函数的特定名称空间,以便调用它?

调用在以下方法或属性之间是不明确的:IWebHostBuilder,字符串)和"Microsoft.AspNetCore.Hosting.HostingAbstractionsWebHostBuilderExtensions.UseContentRoot (Microsoft.AspNetCore.Hosting。IWebHostBuilder, string)'

这是错误(读起来有点乱),但这就是问题所在。

代码如下:

 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Builder;     
 public static void Main(string[] args)
        {
            var host = new  WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory()) //The Problem!!
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }

如何在c#中调用特定的命名空间函数

您正在使用流畅的符号(连续调用方法链接在一起),并且在此过程中依赖于静态扩展方法,所有这些都是很好的风格。不确定如何保持这种漂亮的风格,但如果将其分开,可以通过名称空间定位所需的方法调用。

 var intermediateResult = new  WebHostBuilder()
    .UseKestrel();

现在选择您想要的方法(我的示例使用第一个名称空间中的方法,但这是您的选择)。

Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions.UseContentRoot(intermediateResult, Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

很丑,但是应该可以编译,并且可以运行。


注意。您将注意到,我用两个参数调用了方法UseContentRoot() !这只是在明确下面发生了什么。

静态扩展方法使用一个初始参数编写,该参数表示该方法将作为扩展方法服务的类。因此,UseContentRoot(String currentDir)实际上写成了类似于UseContentRoot(this IWebHostBuilder builder, String currentDir)的东西,这意味着UseContentRoot是为类(接口)IWebHostBuilder编写的扩展方法。

特殊的this关键字用法现在允许方法被调用(和链接在你的情况下),好像该方法是IWebHostBuilder的成员,所以如果你有一个IWebHostBuilder builder,你可以做builder.UseContentRoot(currentDir)。所以初始参数"移动"到圆点的左边,看起来这个扩展方法在IWebHostBuilder上被声明为一个带一个参数的方法。

但是把它当作属于IWebHostBuilder的方法来调用只是为了方便。您仍然可以按照最初编写的方式调用该方法,并使用其声明的两个参数:UseContentRoot(IWebHostBuilder builder, String currentDir),这就是它的实际声明方式。