- PR -

「Fileを開く」ダイアログをProperty.getvalueで操作したときの結果

1
投稿者投稿内容
tmu_tmu2000
会議室デビュー日: 2007/01/15
投稿数: 10
投稿日時: 2007-01-29 01:19
「Fileを開く」ダイアログを.Multiselect = True で複数指定OKに指定し、
  invokememberでshowdialogを走らせると, ダイアログが開きます。
  配列でない普通のPropertyは結果を取得できるのですが、

 PropertyInfo= instance.gettype.getProperties("FileNames")で取得し、
dim a as object = PropertyInfo.GetValue(instance,noting)で結果を取得した際,結果が1件しか取れません。
.Multiselect = True で使用した際, aは array型で戻ってくるのですが,要素数は1なのです。

showDialogで使用すると,該当要素分が FileNamesに格納されてますので,動作はOKかと思います。
第二引数を指定すると [パラメータ カウントが一致しません。]となります。
PropertyInfo.GetValue()で複数要素の結果を取得できないものでしょうか宜しく願います。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-01-29 02:04
手元で試してみましたが、.NET のバージョンに関わらず複数要素を持つ String 配列を取得できました。
再現できるコードを書いていただけませんか?

// まあ、そもそもわざわざリフレクション使うところじゃないだろうと思いますが。
tmu_tmu2000
会議室デビュー日: 2007/01/15
投稿数: 10
投稿日時: 2007-01-29 12:17
Hongliangさんありがとうございます。(解決報告)

>// まあ、そもそもわざわざリフレクション使うところじゃないだろうと思いますが。
業務的には使う必要はないのですが、 Dialogなどのコントロールの動作確認用のプログラムをつくってまして、
実行モードでのPropertyGridではものたりなく,相当品を作成しています。

> 手元で試してみましたが、.NET のバージョンに関わらず複数要素を持つ String 配列を取得できました。

単独機能でコーディングすれば,望み通り動作しました。

ところが,アプリに組み込むと一つにしぼられています。 追いかけてますと,
"FileName" Propertyをセットした段階で "FileNames"が置換されることが判りました。

アプリでは,PropertyGrid相当品で値が確定するたびに該当Propertyを更新してますので,
FileNamesを取得する前に, FileNameを更新したので,つぶしあってました。
この動作は仕様のようですね. お騒がせしました。

  参考までに,確認ソースを記します。

Dim obz As New OpenFileDialog()
'=================
Dim flag As BindingFlags = System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.Static Or System.Reflection.BindingFlags.GetProperty
Dim TP As Type = obz.GetType
Dim pis As PropertyInfo = TP.GetProperty("Multiselect")
pis.SetValue(obz, True, Nothing)
Dim pi As PropertyInfo = TP.GetProperty("FileNames")
Dim ret As Object = obz.GetType.InvokeMember("ShowDialog", BindingFlags.InvokeMethod, Nothing, obz, Nothing)
'=================
Dim rc As Object = pi.GetValue(obz, Nothing)
MessageBox.Show(rc.ToString)
'=================
Dim pi3 As PropertyInfo = TP.GetProperty("FileName")
pi3.SetValue(obz, "TESTFILE", Nothing)
Dim pi4 As PropertyInfo = TP.GetProperty("FileNames")
Dim rc4 As Object = pi4.GetValue(obz, Nothing)
'=================

pi3.setvalue の時に置換されていました。


1

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