1

いくつかのパブリック クラスと多くの内部ユーティリティ クラスを含むクラス ライブラリがあります。これらのユーティリティは、DLL に対してリンクする人々に表示/使用可能であってはなりません。

namespace MyProject {
    public class PublicClass { }
}
namespace MyProject {
    internal class UtilClass { }
}

これを行うと、VSは「UtilClassはPublicClass.Memberよりもアクセスしにくい」などのエラーをトリガーします

私は何か間違ったことをしていますか?これをどのように行う必要がありますか?私が使用できないプライベート クラスを含むライブラリを見てきました。この動作を取得するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

7

これは、タイプのpublicメンバーが にあることを意味UtilClassしますPublicClass。外部アセンブリはパブリック メンバーにアクセスできるため、コンパイラはこれを許可しませんが、メンバー自体の型は内部であり、アクセスできないわけではありません。

そのメンバーをパブリックではなく内部にします。

于 2012-08-22T11:00:47.940 に答える
1

あなたのエラーは非常に一般的です。例として、2 つのクラスがある場合:

public class PublicClass { ... }

private class PrivateClass { ... }

これはエラーを返しません。しかし、PublicClass のようなプロパティを追加すると

public PrivateClass MyProperty { ... } 

エラーが発生します。そのプロパティはライブラリのユーザーに表示されますが、プロパティのタイプは表示されないためです。

于 2012-08-22T10:58:34.650 に答える
1

あなたが提供したものはうまくいくはずなので、完全なコードを見せていないのではないかと思います。

内部クラス EG のインスタンスを返すパブリック メソッドまたはプロパティが必要です。

namespace MyProject 
{
    public class PublicClass 
    {
        public UtilClass DoSomething() {} 
        public UtilClass { get; }
        // External assemblies cannot see the UtilClass  type which is
        // why this does not work.
    }
}

外部アセンブリがそれについて知る必要があるため、これは明らかに実行できません。

内部型を公開せずに動作を公開するパブリック プロパティが本当に必要な場合は、ユーティリティ クラスが実装できるインターフェイスを用意することを検討してください。

これにより、ヘルパー クラスを内部に保持しながら、(インターフェイスを介して) 外部アセンブリに公開することができます。

internal class UtilClass : IMyPublicInterface 
{ 
}

namespace MyProject 
{
    public class PublicClass 
    {
        public IMyPublicInterface DoSomething() {} 
        public IMyPublicInterface { get; }
        // External assemblies now only need to know about the public interface.
    }
}
于 2012-08-22T11:02:19.180 に答える