【解決方法】非公開メンバーへのアクセス


非公開メンバーにアクセスするにはどうすればよいですか?

「frequencies」と呼ばれる非公開メンバーを持つ doseSuggestiions というオブジェクトがあります。

同じようにアクセスしたいです。

これで私を助けてください

解決策 1

基本的に、C# には 4 つのアクセス修飾子があります。 公開、保護、内部、および非公開。 各修飾子の定義は次のとおりです。

1. 公衆 [^] keyword は、型および型メンバーのアクセス修飾子です。 パブリック アクセスは、最も寛容なアクセス レベルです。 public メンバーへのアクセスに制限はありません。

2. 保護された[^] キーワードはメンバー アクセス修飾子です。 保護されたメンバーは、それが宣言されているクラス内から、およびこのメンバーを宣言したクラスから派生した任意のクラス内からアクセスできます。

3. 内部[^] keyword は、型および型メンバーのアクセス修飾子です。 内部メンバーは、同じアセンブリ内のファイル内でのみアクセスできます。 内部アクセスの一般的な用途は、コンポーネント ベースの開発です。これにより、コンポーネントのグループがアプリケーション コードの残りの部分にさらされることなく、プライベートな方法で連携できるようになるためです。 たとえば、グラフィカル ユーザー インターフェイスを構築するためのフレームワークは、内部アクセスを持つメンバーを使用して連携する Control クラスと Form クラスを提供できます。 これらのメンバーは内部であるため、フレームワークを使用しているコードには公開されません。

4. プライベート[^] キーワードはメンバー アクセス修飾子です。 プライベート アクセスは、最も許容度の低いアクセス レベルです。 プライベート メンバーは、宣言されているクラスまたは構造体の本体内でのみアクセスできます。

つまり、非パブリック変数に応じて、メンバーのアクセシビリティ レベルが異なります。

解決策 3

非パブリック メンバーにアクセスする唯一の方法は、リフレクションです。 問題は、この方法はあまりサポートされていないことです。 たとえば、名前でメンバーを見つけることができますが、文字列を間違って入力したり、名前が後で変更されたりすると、コンパイル時のチェックで警告が表示されず、メンバーが見つかりません。 すべてのメンバーを、メンバーの多様な配列としてまとめて検索することも、すべてのフィールド、すべてのプロパティ、すべてのイベント、すべてのメソッド、すべてのコンストラクター、または実装されたインターフェイスを個別に検索することもできます。 公開メンバーまたは非公開メンバーで検索を制限できます。

次の方法を使用します。 System.Type: FindInterfaces, GetInterface, GetInterfaces, GetMember, GetMembers, GetMethod, GetMethods, GetProperty, GetProperties, GetEvent, GetEvents, GetConstructorImpl, GetConstructor.

見る http://msdn.microsoft.com/en-us/library/system.type.aspx[^].

非パブリック メソッドを見つけるには、”Get...” を使用した方法 System.Reflection.BindingFlags パラメータ; 使用する System.Reflection.BindingFlags.NonPublic また System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public

-SA

解決策 2

アクセスできるパブリック プロパティを作成します。

解決策 16

プロパティへのアクセスはこちら

public static PropertyInfo GetPropertyByName<T>(this T t, BindingFlags flags, string name)
        {
            PropertyInfo[] infos = t.GetType().GetProperties(flags);
            System.Collections.IEnumerator enumerator = infos.GetEnumerator();
            while(enumerator.MoveNext())
            {
                PropertyInfo info = (PropertyInfo)enumerator.Current;
                if(info.Name == name)
                {
                    return info;
                }
            }
            return null;
        }

フィールドへのアクセスはこちら

public static FieldInfo GetFieldByName<T>(this T t, BindingFlags flags, string name)
        {
            FieldInfo[] infos = t.GetType().GetFields(flags);
            System.Collections.IEnumerator enumerator = infos.GetEnumerator();
            while (enumerator.MoveNext())
            {
                FieldInfo info = (FieldInfo)enumerator.Current;
                if (info.Name == name)
                {
                    return info;
                }
            }
            return null;
        }

コメント

タイトルとURLをコピーしました