- PR -

そのフィールドが、read onlyであるかどうかを調べる

投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-05-26 20:47
クラスに定義したフィールド変数がreadonly指定されているかどうかを
チェックする方法ありますでしょうか?

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(class1);
PropertyDescriptor property = properties.Find("Prop", true);
property.IsReadOnly
とやることで、プロパティのgetしかないことはチェックできたのですが
readonly指定かどうかはチェックできませんでした。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-26 21:05

readonly なら FieldInfo.IsInitOnly で、const なら FieldInfo.IsLiteral で確認できます。
FieldInfo は Type.GetField で取得します。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-05-26 21:40
ありがとうございます。無事できました。
Type.GetMemberを使ってできなかったのであきらめてました。Type.GetField()でしたか。
すいません。リフレクション関連でもうひとつあるのですが
privateメソッドは呼べますが、internalクラスを呼び出すことはできるのでしょうか?
(別スレかなと思ったのですが関連ということでご容赦ください)

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-26 22:11
引用:

頭脳パンさんの書き込み (2006-05-26 21:40) より:

すいません。リフレクション関連でもうひとつあるのですが
privateメソッドは呼べますが、internalクラスを呼び出すことはできるのでしょうか?


メソッドの呼び出しと、クラスの呼び出しでは "ますが" にはならないような...
"クラスを呼び出す" とは、そのクラスのインスタンスを生成したいということでしょうか?
アクセス修飾子が何であろうと、リフレクションでできるはずですが、何に困っているのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-26 22:16
引用:

頭脳パンさんの書き込み (2006-05-26 21:40) より:

privateメソッドは呼べますが、internalクラスを呼び出すことはできるのでしょうか?
(別スレかなと思ったのですが関連ということでご容赦ください)


質問が省略されているように思えてなりません。
internalクラスを呼び出す?
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-05-29 09:05
すいません。質問を省略してしまいました。
internal指定をしたクラスのインスタンスを作成して
そのメソッドを呼び出したいんです。
(internal指定をしたクラスが、internalであることをチェック、
 およびテストコード作成を考えています)
ただ、internal指定されているクラスをテストコードから
使用しようとすると「アクセスできない保護レベルになっています。」になってしまいます。
それで、何かよい方法はないものかと質問をしました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-29 10:35
引用:

頭脳パンさんの書き込み (2006-05-29 09:05) より:

internal指定をしたクラスのインスタンスを作成してそのメソッドを呼び出したいんです。
(snip)
ただ、internal指定されているクラスをテストコードから
使用しようとすると「アクセスできない保護レベルになっています。」になってしまいます。


internal ということは、別アセンブリからの呼び出しに影響するということもあり、
別アセンブリでテストしてみましたが、問題なく呼び出すことができました。

コード:

    private static void MosaMosaAA() {
        // アセンブリのロード
        System.Reflection.Assembly oAssembly = System.Reflection.Assembly.Load("Jeanne2");

        if (oAssembly == null) {
            MessageBox.Show("アセンブリがロードできませんでした");
            return;
        }

        // アセンブリから型を取得する
        System.Type oType = oAssembly.GetType("Jeanne.Data.TClass1");

        if (oType == null) {
            MessageBox.Show("型が取得できませんでした");
            return;
        }

        // ターゲットのインスタンスを取得
        object oTarget = oType.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);

        if (oTarget == null) {
            MessageBox.Show("ターゲットのインスタンスを生成できませんでした。");
            return;
        }

        // 試しに Method1 というメソッドを呼び出してみる
        oType.InvokeMember(
            "Method1",
            System.Reflection.BindingFlags.InvokeMethod |
            System.Reflection.BindingFlags.Instance     |
            System.Reflection.BindingFlags.NonPublic,
            null,
            oTarget,
            null
       );
    }



引用:

(internal指定をしたクラスが、internalであることをチェック、およびテストコード作成を考えています)


これは面倒ですね。(多分)
アセンブリからロードしたか否か、その他もろもろと分岐しないといけないような気がします。
もしかすると、同一アセンブリだと区別がつかないかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-05-29 10:59
わざわざコードまでありがとうございます。
呼び出すことはできるみたいですね。
internalのチェックは難しいようですが、よくよく要求をみてみると
どうやらpublicでいいみたいなので、申し訳ないです。
internalのチェックはやらないことにしました。

スキルアップ/キャリアアップ(JOB@IT)