DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Type.InvokeMemberでインスタンスを作成した場合、コンストラクタが呼び出されない

環境/言語:[XP, c#]
分類:[.NET]

お世話になります。

どのクラスのインスタンスを生成するか、実行しないと
分からない処理があります。

そこで「Type.GetType」より、作成するクラスのTypeを取得し、
InvokeMemberメソッドにより、インスタンスを生成しています。
(こちらのホームページより勉強させて頂きました)

しかし、この方法だと、生成するクラスのコンスタラクタが実行されません。
コンストラクタを実行したい場合は、どのような方法がありますでしょうか。

Type type = Type.GetType("Namespace.CreateClass");

object target = type.InvokeMember(null,
BindingFlags.CreateInstance,
null,
new object(),
null);


何かお分かりになる方、いらっしゃいましたらご指導願います。
質問文に不明点がある場合は、補足をお願い致します。
コンストラクタが実行されないわけではなく、コンストラクタに渡す引数を指定しなかったために引数なしのデフォルトコンストラクタが実行されているだけでしょう。
Type.InvokeMember のオーバーロードには全てコンストラクタに渡す引数のパラメータが含まれています。

が、まあ InvokeMember とか使う時点で設計を疑うべきですね。
>Hongliang様

回答有難うございます。
引数を持っていないコンストラクタ(=デフォルトコンストラクタと解釈しております)が、実行されておりません。
デバックで調べましたが、通っておりません。

> InvokeMember とか使う時点で設計を疑うべき

そうなんですか汗
はじめて使うメソッドなのですが、今回のシステムでは
とても重宝しておりますが汗
すいません。
当質問の内容に関しては解決していないのですが
別の手法により、問題は解決しました。

時間がないため、締め切らせて頂きます。
お考え下さった皆様、有難うございました。
解決済み!
■No18009に返信(yamaneさんの記事)

こんにちは。

> 当質問の内容に関しては解決していないのですが
> 別の手法により、問題は解決しました。
できればその「別の手法」について解説していただけると、将来同じようなことでつ
まづいた方々にとって福音になると思うのですが、いかがでしょうか。

> > InvokeMember とか使う時点で設計を疑うべき
>
> そうなんですか汗
> はじめて使うメソッドなのですが、今回のシステムでは
> とても重宝しておりますが汗
私は InvokeMember を使ったことがないので、Hongliang さんの真意についてはわ
かりかねますが、「使う時点で設計を疑うべき」 InvokeMember を「とても重宝してい
る」と感じてしまうような設計を「疑うべき」という話なのかなぁと思いましたが、どうで
しょうか。
解決済み!
■No18010に返信(ぽぴ王子さんの記事)
>
> 私は InvokeMember を使ったことがないので、Hongliang さんの真意についてはわ
> かりかねますが、「使う時点で設計を疑うべき」 InvokeMember を「とても重宝してい
> る」と感じてしまうような設計を「疑うべき」という話なのかなぁと思いましたが、どうで
> しょうか。

私の勝手な想像だと、
・遅延バインディングであること
・それにしても、抽象I/Fクラスを継承またはI/Fインターフェースなどで派生実装以外は「型」で扱うことができる
というようなことになります。
#ほんとに使わなければならないのか、ということですかね?
解決済み!
ちょっと言い過ぎたかな。
プラグイン機構などリフレクションを使わざるをえない場面もありますし。

大体まどかさんの仰るとおり。
リフレクションはオブジェクト指向の基本的な部分を覆す機能です。
.NET や C#/VB がオブジェクト指向言語として作られている以上、普通に設計すれば出番はないはず。

で、それはともかく。
> 引数を持っていないコンストラクタ(=デフォルトコンストラクタと解釈しております)が、実行されておりません。
> デバックで調べましたが、通っておりません。
ごく簡単なテストではきっちりデフォルトコンストラクタを通りましたよ?

DOBON.NET | プログラミング道 | プログラミング掲示板