2016-08-11 6 views
3

В настоящее время у меня есть две функции из той же библиотеки, которые могли бы быть вызваны в моей ситуации. Как указать конкретное пространство имен функции так, чтобы оно было вызвано.Как вызвать функцию определенного пространства имен в C#

Вызов неоднозначен между следующими методами или свойствами: 'Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions.UseContentRoot (Microsoft.AspNetCore.Hosting.IWebHostBuilder, строка)' и «Microsoft.AspNetCore.Hosting.HostingAbstractionsWebHostBuilderExtensions .UseContentRoot (Microsoft.AspNetCore.Hosting.IWebHostBuilder, строка)»

То есть ошибка (немного неаккуратно, чтобы прочитать), но это проблема.

Вот код:

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(); 
     } 
    } 
+0

Вам действительно нужно импортировать оба пространства имен? – DavidG

+0

Он автоматически импортирует их при использовании библиотеки. Также это автогенерированный код из AspnetCore. Я не редактировал haha ​​... – jStaff

+0

Вы уверены, что вам нужен Microsoft.AspNetCore.Builder? Это не нужно в моей настройке. – DavidG

ответ

3

Вы используете свободно обозначения, (последовательные вызовы методов сцепленных вместе), и опираясь на статические методы расширения вдоль пути, все из которых хороший стиль. Не уверен, как сохранить этот приятный стиль, но если вы разделите его, вы можете настроить целевой вызов метода через пространство имен.

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), который как и фактически объявлен.

+0

Спасибо! Мне очень нравится ваш ответ. Очень тщательно! И это работает ха-ха. – jStaff

Смежные вопросы