2016-08-11 8 views
3

現在、私は両方の状況で呼び出すことができる同じライブラリの2つの関数を持っています。関数の特定の名前空間を指定して呼び出す方法を教えてください。C#で特定の名前空間の関数を呼び出す方法

コールは次のメソッドまたはプロパティとの間に曖昧である: 'Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions.UseContentRoot(Microsoft.AspNetCore.Hosting.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(); 
     } 
    } 
+0

本当に両方の名前空間をインポートする必要がありますか? – DavidG

+0

ライブラリを使用するときに自動的にインポートされます。これはAspnetCoreの自動生成コードです。私は編集しませんでした。... – jStaff

+0

'Microsoft.AspNetCore.Builder'が必要ですか?私のセットアップでは必要ありません。 – DavidG

答えて

3

:ここ

はコードです。その素敵なスタイルを維持する方法はわかりませんが、それを分割すると、ネームスペースを使用して、必要なメソッド呼び出しをターゲットにすることができます。

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

ここで、どのメソッドを使用するかを選択します(私の例では、最初の名前空間のメソッドを使用しますが、これは選択です)。

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

醜いですが、コンパイルする必要がありますが、おそらく実行する必要があります。


注意。あなたは2つのパラメータでメソッドUseContentRoot()を呼び出したことに気付くでしょう!それは単に下に起こっていることを明確にしているだけです。

静的拡張メソッドは、メソッドが拡張メソッドとして機能するクラスを表す初期パラメータで記述されます。したがって、UseContentRoot(String currentDir)は実際にUseContentRoot(this IWebHostBuilder builder, String currentDir)のように書かれています。つまり、UseContentRootはクラス(インタフェース)IWebHostBuilderのために書かれている拡張メソッドです。

方法はIWebHostBuilderの一員であるかのようにあなたがIWebHostBuilder builderを持っている場合、あなたはbuilder.UseContentRoot(currentDir)を行うことができるように、特別なthisキーワードの使用は現在、メソッドが呼び出される(と、あなたのケースでチェーン)することができます。したがって、最初のパラメータはドットの左側に「移動」し、1つのパラメータを取るメソッドとしてIWebHostBuilderにこの拡張メソッドが宣言されているように見えます。

しかし、これはIWebHostBuilderに属する方法であるかのように呼び出すのが便利です。このメソッドは、最初に記述されたとおりに、宣言されたパラメータの両方を使用して呼び出すことができます:UseContentRoot(IWebHostBuilder builder, String currentDir)、実際に宣言されている方法です。

+0

ありがとうございます!私は本当にあなたの応答が好きです。非常に徹底的!そして、それはハハを動作させる。 – jStaff

関連する問題