VisualStudio2005、C#、ライブラリプロジェクトで開発をしています。
InvokeMemberで、指定のプロパティをセットしたいのですが、以下のソースで
Assembly asm = GetAssembly(Oracle.DataAccess, Version=2.102.2.20,
Culture=neutral, PublicKeyToken=89B483F429C47342);
Type type = asm.GetType(Oracle.DataAccess.Client.OracleParameter);
type.InvokeMember(OracleDbType,
BindingFlags.SetProperty,
null,
param,
new object[] { 121 }); // 121は、OracleDbType.RefCursorのenum値。
(*)paramは、IDataParameter
↓のエラーになってしまいます。
System.MissingMethodException: メソッド
'Oracle.DataAccess.Client.OracleParameter.OracleDbType' が見つかりません。
InvokeMemberでenumの値をセットするにはどうすれば良いでしょうか。
Oracle名前空間は使ったことがないですが……。
とりあえず,121のかわりにEnum.ParseかEnum.ToObject使って,
OracleDbType型のオブジェクトを渡すとどうなりますか?
昨日は帰り際にてんぱって、書き込みしてしまいました。
ご指摘のように、
new object[] { Enum.Parse(type2, 121) });
あるいは、
new object[] { Enum.ToObject(type2, 121) });
としたところ、どちらも成功しました。
Enumなのでintで良いだろうと思ってましたが
これらを使ってEnumのオブジェクトを渡さないといけなかったのですね。
YuOさん、ありがとうございました。
あ、↑のtype2は、OracleDbTypeから作成したTypeオブジェクトです。
これって、ODPがバージョンアップして、もしOracleParameter.OracleDbTypeが121
ではなくなったら動かなくなりそうですが、これは仕方ないところですよね。
Enum.Parseには列挙値だけでなく列挙名を渡せます。
なので,
Enum.Parse(type2, RefCursor)
のようにすれば,OracleDbType.RefCursorが取得出来ます。
>Enum.Parse(type2, RefCursor)
試してみましたところ見事できました。
ほんと助かりました。ありがとうございます。