- PR -

【VB.NET】リフレクションでByref引数(クラスオブジェクト)のメソッドをGetMethodできない

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/07/14
投稿数: 8
投稿日時: 2006-07-20 15:49
前回

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32128&forum=7
 【VB.NET】リフレクションでByref引数のメソッドをGetMethodできない

で、Long型のByref引数の件は回答いただきました。

では、クラスをNewしたオブジェクトがByref引数の場合はどうやればよろしいでしょうか?
重ねての質問ですみません。
よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 16:55
引用:

未記入さんの書き込み (2006-07-20 15:49) より:

では、クラスをNewしたオブジェクトがByref引数の場合はどうやればよろしいでしょうか?


"クラスを New したオブジェクト" の意味が、ちょっとわからないのですが、
規定の .NET Framework にない、独自の型の場合という解釈でよろしいでしょうか?

それと、環境は何でしょうか?
.NET Framework 2.0 (VB8 | VB2005) であれば、

コード:

    GetType(Jeanne.Nullable.DateTime).MakeByRefType()


のように、MakeByRefType メソッドが使用できます。

1.x 以前でも、前スレッド同様に取得できます。

コード:

    Private Sub MosaMosaAA()
        Dim infoType    As System.Type = GetType(TestClass)
        Dim methodInfo  As System.Reflection.MethodInfo

        methodInfo = infoType.GetMethod( _
            "ByRefMethod", _
            System.Reflection.BindingFlags.NonPublic Or _
            System.Reflection.BindingFlags.Instance,    _
            Nothing, _
            New System.Type() {System.Type.GetType("Jeanne.Nullable.DateTime&")}, _
            Nothing _
        )

        If Not methodInfo Is Nothing Then
            MessageBox.Show("取得できたよ : " & methodInfo.ToString())
        End If
    End Sub


もしかして、別のアセンブリの型を呼び出したいという意味でしょうか?
であれば、System.Reflection.Assembly クラスについて調べてみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/07/14
投稿数: 8
投稿日時: 2006-07-20 20:44
いつもありがとうございます!

ご指摘のとおり
別のアセンブリの型を呼び出したいという意味です。
New System.Type() {System.Type.GetType("Jeanne.Nullable.DateTime&")}

参考にして、アセンブリのネームスペースを指定して最後に&をつけてやってみました。
「System.ArgumentNullException : 値を Null にすることはできません。」
という例外が発生してしまいました。

なにぶん素人ですみません。
再度ご教授願えますでしょうか?
未記入
会議室デビュー日: 2006/07/14
投稿数: 8
投稿日時: 2006-07-20 20:50
ちなみに、
.NET Framework v1.1です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 20:53
引用:

未記入さんの書き込み (2006-07-20 20:44) より:

参考にして、アセンブリのネームスペースを指定して最後に&をつけてやってみました。
「System.ArgumentNullException : 値を Null にすることはできません。」
という例外が発生してしまいました。


これは、System.Type.GetType メソッドの戻り値が、Nothing だからです。
単純に型が取れていないということです。(別アセンブリであれば、当然取れません)

引用:

ご指摘のとおり別のアセンブリの型を呼び出したいという意味です。


System.Reflection.Assembly クラスについては調べましたか?
どのメンバが使えそうか、見当は尽きませんでしたか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/07/14
投稿数: 8
投稿日時: 2006-07-21 09:26
Typeを拾えました!
これでByref引数が他のアセンブリ型の場合でも問題なく動きました。

Dim asm As [Assembly] = System.Reflection.Assembly.GetAssembly(GetType(Jeanne.Nullable.DateTime))
Dim typ() As Type = New System.Type() {asm.GetType("Jeanne.Nullable.DateTime&")}

例題に置き換えるとこんな感じでしょうか。
ありがとうございました!(お手数おかけしました。。)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-07-21 11:19
個人的には、v2.0で追加されたようなメソッドを自分で作るほうがお勧めかな。
※もちろん直に書いてもできることはできますが。

たとえば、
コード:
public Type MakeByRefType(Type type)
{
  return type.Assembly.GetType(type.FullName + "&");
}


みたいなのを作っておいて、
Type refType = MakeByRefType(typeof(MyType));
とか。
要は元のTypeを求めておいて、その型の参照型を作成するという流れです。
1

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