2

内部プロパティを持つクラスがあります:

internal virtual StateEnum EnrolmentState  
{
    get { ..getter logic }
    set { ..setter logic }
}

ただし、アセンブリの外部でこのプロパティにアクセスできるようにしたいので、単にこのプロパティを返すメソッドを作成しました。

public StateEnum GetCurrentState()
{
    return EnrolmentState;
}

しかし、このアセンブリの外部のクラスからこのメソッドを呼び出すと、例外が発生します

(System.TypeLoadException: Method 'get_EnrolmentState' on type 'EnrolmentAopProxy' from assembly '44fe776f-458e-4c5d-aa35-08c55501dd43, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is overriding a method that is not visible from that assembly.)

したがって、何らかの方法でアセンブリの外部の内部メンバーにアクセスすることは可能です。または、別のアプローチを検討する必要があります。

このクラスは O/R マッパー エンティティ (NPersist) として使用され、永続化コードを挿入するために O/R マッパーからオーバーライドされます。

4

3 に答える 3

2

そもそもなぜ物件が内部にあるのですか?パブリックアクセスが必要な場合は、パブリックにします。そもそもそれにアクセスするためのパブリックメソッドを追加することができないので、これをある程度制御できると思います。

選択した他のアセンブリだけがそれにアクセスできるようにしたい場合InternalsVisibleToは、あなたの友人です(しゃれは意図されていません)-しかし、Erikが言うように、その時点で設計を慎重に検討する必要があります。

その特定のエラーが発生する理由については、AOPプロキシがパブリックメソッドを使用するのではなく、内部プロパティをオーバーライドしようとしているようです。特定の設定について詳しく知らずに変更できるかどうかを知るのは難しいですが、プロパティを公開する方が簡単な修正になる可能性があります。

于 2008-12-04T08:51:45.033 に答える
0

はい、これが奇妙なデザインであることに同意します。InternalVisibleTo属性が機能しないため、保護された修飾子を使用します。

于 2008-12-04T10:43:45.960 に答える
0

これは、デザインの選択を再考する必要があるように思えます。内部は、実行しようとしていることを回避するために使用されるため、代わりにプロパティへの何らかのパブリック アクセスを使用することを検討してください。

InternalsVisibleTo 属性を使用して、特定のアセンブリが内部プロパティに到達できるようにすることは可能ですが、私の観点からは、それは設計が不十分です。

于 2008-12-04T08:46:43.403 に答える