2016-04-22 11 views
0

メソッドに文字列を渡そうとしていて、渡される文字列に基づいて、BasicHttpBindingまたはWSHttpBindingをインスタンス化します。次のif文が私のコードにあります。C#ifステートメントの共通基底クラスの宣言変数

if(bindingObject == "basic") 
{System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();} 
else 
{System.ServiceModel.WSHttpBinding binding = new System.ServiceModel.WSHttpBinding(); 

このコードは私にエラーを与える

「結合」の名前は、私が共通の基底クラスを使用する必要がありそうです私の研究から、現在のコンテキスト

には存在しません

私が使用する必要があるServiceModelに関係なく、というバインディング変数を使用したい場合は、2つのサービスモデルの間で。

私の質問は、動作する共通の基本クラスは何ですか?または、これを行う方法があります。私が見つけた最も近いSystem.ServiceModel.Channels.Bindingされるが、その後、私は、このような

などのエラーが「MaxBufferPoolSize」の定義なし拡張メソッドが含まれていません取得「MaxBufferPoolSize」 'tyepの最初の引数を受け入れますSystem.ServiceModel.Channels.Bindingは」

+0

このようなさまざまなタイプの変数を宣言することはできません。 –

+0

if-thenブロックを汎用メソッドにリファクタリングして、適切なバインディングを返すことができます。つまり、 'public T GetBinding ();' – Tim

答えて

0

にアクセスすることができ、動的キーワードのための完璧なユースケース

 dynamic binding; 
     if (bindingObject == "basic") 
     { 
      binding = new System.ServiceModel.BasicHttpBinding(); 
     } 
     else 
     { 
      binding = new System.ServiceModel.WSHttpBinding(); 
     } 

です。 MSDNからスコープのC#の仕様によれば、

スコープはネストすることができ、内部スコープが外側の範囲から名前の意味を再宣言することができる(これは、しかし、§1によって課される制限を削除しません。20では、ネストされたブロック内で、囲むブロック内のローカル変数と同じ名前のローカル変数を宣言することはできません)。識別子スコープの仕様から

別の、発現または宣言における単純名として指定された識別子の各発生について

、ローカル変数宣言空間内で、直ちに囲むブロック、またはスイッチ直ちに囲むブロックまたはスイッチブロック内の式または宣言子の単純名と同じ識別子の他のすべての出現は、同じエンティティを参照する必要があります。このルールは、指定されたブロック、スイッチブロック、for-foreach-またはusing-statement、または無名関数内で名前の意味が常に同じであることを保証します。

は、今あなたが直面しているエラーに移動: BasicHttpBindingがHttpBindingBase Binding由来と IBindingRuntimePreferencesを実装して、そこから派生しています。 WSHttpBindingは、 Bindingに由来するWSHttpBindingBaseから守られ、 IBindingRuntimePreferencesを実装します。

ただし、プロパティMaxBufferPoolSizeは、HttpBindingBaseおよびWsHttpBindingBaseにあり、共通の親のBindingまたはIBindingRuntimePreferencesには存在しません。つまり、これらのバインディングを表すために共通のクラスを使用することはできません。むしろコンパイル時ではなく実行時に型を束縛する型としてdynamicを使うべきです。

Public dynamic GetBinding(string bindingObject) 
{ 
    if (bindingObject == "basic") 
    { 
     binding = new System.ServiceModel.BasicHttpBinding(); 
    } 
    else 
    { 
     binding = new System.ServiceModel.WSHttpBinding(); 
    } 

    return binding; 
    } 
+0

これはいくつかの注意書きで作業しました。まず、動的バインディングの変数を宣言しなければなりませんでした。 GetBindingメソッドを使用します。その後、私はこれが.net 3.5コードであることを認識し、プロジェクトを4.0に変換しなければならなかった – Bryan

1

ファーストを見つけることができる:Visual Studioを使用している場合BasicHttpBindingBasicHttpBindingの両方が同じ基本クラスから派生するか、同じinterface

を実装のいずれかに必要な、あなたはカーソルをタイプにf12を押して、どのタイプから派生しているのか、どのタイプのインターフェイスを実装しているのかを確認してください。使用するのに適したタイプは、あなたがそれらで何をしたいかによって異なります。 BasicHttpBindingWSHttpBindingのドキュメントによると、共通の基底クラスがSystem.ServiceModel.Channels.Bindingであるように思わ

あなたが使用する必要があるメンバーを定義してそこのインターフェイスはおそらくありますので、あなたは、とにかくチェックするf12を使用する必要があります。それはあなたが必要とする機能へのアクセスを提供する場合

第二には、あなたは、あなたがバインド基本クラスまたはIBindingRuntimePreferencesインタフェースを枯れ使用することができ、あなたの

System.ServiceModel.Channels.Binding binding; 
if(bindingObject == "basic") 
{ 
    binding = ... 
} 
else 
{ 
    binding = ... 
} 
+0

の2つのクラスが持つ最も良い共通基盤は 'System.ServiceModel.Channels.Binding'です –

+0

@ScottChamberlain私はちょうどそれを見ていた –

+0

私はOPにキャストする必要があると思う一方のバインディングが持つものと他方のものを設定しようとしている場合、プロパティにアクセスする派生クラス。 – Tim

0

if文の文脈の外でそれを宣言する必要があります。

//System.ServiceModel.Channels.Binding binding; 
    System.ServiceModel.Channels.IBindingRuntimePreferences binding; 
    if(bindingObject == "basic") 
     binding = new System.ServiceModel.BasicHttpBinding();} 
    else 
     binding = new System.ServiceModel.WSHttpBinding(); 
0

それは次にあなたが直面している問題は、ローカル変数のスコープである以下の

 binding.MaxBufferPoolSize = 10; 
+0

は緩やかに見えます。 –

関連する問題