2017-08-11 20 views
0

この作業を行うのは苦労しています。DLLの外部クラスにアクセスできません。一部のパブリック変数にはアクセスできません。

3つのクラスFooType,& IWebAppは、このDLLの外部にアクセスできないようにする必要があります。したがって、sealed & internalクラスです。 WebAppクラスで

私がいる問題がされている...

1)、FeeType1RouteOneBuilderメソッドのパラメータにアクセスすることはできません。

2)WebAppクラスでは、FeeType1はswitchのcase-statementでアクセスできません。 (目に見えるようにする必要があります)。

3)クラスでは、FeeType1CreditApplicationのプロパティは、スイッチのcase-statement(表示する必要があります)に表示されません。

この複雑なスクリプトには良い方法がありますか?私はすでにこのDLLの外部にあるクラスを公開していますか?ステップ1から4のすべてを別々に解決することができますか(何とか修正することができますか)?

これをもっと簡単にする方法がわかりません。

internal static class FooType 
{ 
    public class FeeType 
    { 
     public FeeType() { } 
     public string CreditApplication = "Credit Application"; 
     public string CreditVehicle = "Credit Vehicle"; 
    } 
    public FeeType FeeType1 
    { 
     get { return new FeeType(); } 
     private set { } 
    } 
}  
sealed class WebApp : IWebApp 
{ 
    public string RouteOneBuilder(FooType.FeeType1 typing) 
    { 
     var xml = ""; 

     switch(typing) 
     { 
      case FooType.FeeType1.CreditApplication: 
       xml = "asdf"; 
       break; 
      default: 
       throw new Exception("Unknown value"); 
     } 

     return xml; 
    } 
} 
internal interface IWebApp 
{ 
    string RouteOneBuilder(FooType.FeeType typing); 
} 
+0

だから、これらのクラスとインターフェイスはすべて同じソースファイルにありますか? –

+0

3つのCSファイルは同じですが、すべて同じプロジェクトファイル(1つのDLLファイル)にあります。 – fletchsod

+0

名前空間はどうですか?同じ名前空間にあるか、異なる名前空間にありますか? –

答えて

1

sealedクラスの定義が正しくありません。 publicprivateprotectedinternalのようなアクセス修飾語ではありません。クラスをsealedとマークすると、それはinheritedからではありません。 アクセスそれ自体について何も言わない。 MSDNのドキュメントから

クラスに適用する場合には、密閉された修飾子はそれから継承他のクラス を防ぐことができます。

これは、あなたがまだpublic class that is sealedを提供できることを意味します。

が密封されたタイプ「YourNamespace.YourSealedClass」から派生することはできません:あなたはsealedクラスから継承しようとする場合は、次のようなコンパイラエラーを受け取ることになります。


また、私はあなたが公開/内部およびネストされたクラスに関するthisthisを読むことをお勧め。

今、あなたが提供されたコードを見て、次のコンパイラエラーがポップアップ表示:

FooType.FeeType1' :静的クラスのインスタンスメンバを宣言することはできません

このエラーがあることを意味しますクラスが静的宣言されている場合、すべてのメンバーも静的でなければなりません。

FooType.FeeType1' はプロパティで 『』が、同じように使用される 『タイプ』

これは、クラスが静的であるが、メンバーのどれもではないという事実から生じます。

矛盾アクセシビリティ:パラメータタイプ 'FooType.FeeTypeが' メソッド未満 アクセス可能である 'IWebApp.RouteOneBuilder(FooType.FeeType)'

戻り型とで参照されるタイプの各メソッドの仮パラメータ・リストは、少なくともメソッド自体と同じくらいアクセス可能でなければなりません。

最後のエラーhereについてさらに詳しく知ることができます。

0

デザインが正しくありません。

タイプがinternalとマークされている場合、これはDLLの外部からアクセスされるべきではないことを示します。この型を宣言されているDLLの外部でアクセスする必要がある場合は、internalとマークしないでください。

public修飾子を使用したり、使用しているコードと同じDLLに型を含めることを妨げている制約はありますか?

場合によっては、外部DLLまたはEXEが別のDLLで宣言されたinternalのメンバーを表示するのに便利です。 1つの注目すべきケースはユニットテストです。テスト中のコードにはinternalというアクセス修飾子が含まれていることがありますが、テストDLLはテストするためにコードにアクセスする必要があります。 internalメンバーを含むプロジェクトのAssemblyInfo.csに外部アクセスを許可するために以下を追加できます。

[assembly:InternalsVisibleTo("Friend1a")] 

詳細については、InternalsVisibleToAttribute Classを参照してください。

サイドノート:sealedアクセス修飾子は、宣言しているDLLの外部からのアクセスを防ぎません。他の型が型を拡張するのを防ぎます。

関連する問題