C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: コンストラクタの動的定義


(過去ログ 59 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■33578 / inTopicNo.1)  コンストラクタの動的定義
  
□投稿者/ デザパタ大好きっ子 (11回)-(2009/03/04(Wed) 22:13:13)

分類:[C#] 

VS2008Pro C#

こんばんは。いつもお世話になっています。

前提ですが、まずFormを継承したクラスAがあったとします。
このクラスAのコンストラクタは引数ありで定義されています。

このクラスAのインスタンスを引数の情報なしに生成したいと考えています。

現在調べたことは以下の通りです。
1. リフレクションでクラスAの引数なしのコンストラクタを動的に生成できないか?
⇒調べましたが、既存のクラスにメソッドを追加定義するやり方が見つかりませんでした。

2. FormatterServices.GetUninitializedObject()でとりあえずインスタンス化し、そのあとプライベートメソッドであるInitializeComponent()を呼ぶ。
⇒InitializeComponent()を呼んだ時点で'オブジェクト参照がオブジェクト インスタンスに設定されていません。'と怒られました。

3. コンストラクタの引数をFormatterServices.GetUninitializedObject()でインスタンス化し、引数ありコンストラクタを呼ぶ。
⇒コンストラクタ内で引数を利用した時点で'オブジェクト参照がオブジェクト インスタンスに設定されていません。'と怒られました。

う〜ん、なんとかInitializeComponent()のみを実行したフォームのインスタンスを取得できないものでしょうか?
引用返信 編集キー/
■33580 / inTopicNo.2)  Re[1]: コンストラクタの動的定義
□投稿者/ Jitta (577回)-(2009/03/04(Wed) 22:34:35)
Jitta さんの Web サイト
No33578 (デザパタ大好きっ子 さん) に返信
> VS2008Pro C#
>
> 前提ですが、まずFormを継承したクラスAがあったとします。
> このクラスAのコンストラクタは引数ありで定義されています。
>
> このクラスAのインスタンスを引数の情報なしに生成したいと考えています。

 C# では、無理です。

>
> 現在調べたことは以下の通りです。
> 1. リフレクションでクラスAの引数なしのコンストラクタを動的に生成できないか?
> ⇒調べましたが、既存のクラスにメソッドを追加定義するやり方が見つかりませんでした。

 リフレクションの意味が違うような(^-^;


> 2. FormatterServices.GetUninitializedObject()でとりあえずインスタンス化し、そのあとプライベートメソッドであるInitializeComponent()を呼ぶ。
> ⇒InitializeComponent()を呼んだ時点で'オブジェクト参照がオブジェクト インスタンスに設定されていません。'と怒られました。
>
> 3. コンストラクタの引数をFormatterServices.GetUninitializedObject()でインスタンス化し、引数ありコンストラクタを呼ぶ。
> ⇒コンストラクタ内で引数を利用した時点で'オブジェクト参照がオブジェクト インスタンスに設定されていません。'と怒られました。
>
> う〜ん、なんとかInitializeComponent()のみを実行したフォームのインスタンスを取得できないものでしょうか?

 引数なしのコンストラクタも定義しておけばよいのでは?

 あるいは、C# はあきらめて、SmallTank のように、動的にクラスを定義できる言語を使うか。
引用返信 編集キー/
■33583 / inTopicNo.3)  Re[1]: コンストラクタの動的定義
□投稿者/ よねKEN (284回)-(2009/03/05(Thu) 01:11:55)
> このクラスAのインスタンスを引数の情報なしに生成したいと考えています。

それは無理じゃないでしょうか。IL命令のレベルでインスタンスの生成を行うnewobj命令にはコンストラクタの指定が必須です。
存在しないコンストラクタは当然指定できません。仮にどうにかして"引数なしコンストラクタ"をそのクラスAに無理やり押し込めたとして、
そうなるとそれはもはやクラスAではなくクラスA'ですね。
後、正当なコンストラクタを経由せずに生成できたインスタンスじゃ内部状態が正常かどうかも信用もできませんね。

というか何がしたいのでしょう。

Jittaさんの
> 引数なしのコンストラクタも定義しておけばよいのでは?
の意見に一票入れときます。

> SmallTank

Smalltalkかしら??
#Smalltalkの.NET向け実装は私はよく知りませんが
引用返信 編集キー/
■33584 / inTopicNo.4)  Re[2]: コンストラクタの動的定義
□投稿者/ デザパタ大好きっ子 (12回)-(2009/03/05(Thu) 08:56:22)
2009/03/05(Thu) 09:37:44 編集(投稿者)

Jittaさん、回答ありがとうございます。

>リフレクションの意味が違うような(^-^;
確かにリフレクションは動的にメタ情報を取得するために利用することが多いですが、
動的に型なども定義できるようですよ?あれ勘違いしてますかね?

ttp://msdn.microsoft.com/ja-jp/library/ms173183(VS.80).aspx


よねKENさん、回答ありがとうございます。

>後、正当なコンストラクタを経由せずに生成できたインスタンスじゃ内部状態が正常かどうかも信用もできませんね。

内部状態は特に気にしていません。

>というか何がしたいのでしょう。

FlowLayoutPanelにアセンブリが持っているフォームを追加したいのです。
最終的にはこれを多言語対応に使います。
リリース後の既存アセンブリから例えば日本語で書かれている部分を英語に置き換えていきます。
置き換えた情報は外部に保存しておき、アセンブリがロード時に言語情報を読み込みます。
最後の仕組みはアセンブリ側に用意するつもりでしたので、多言語対応を意識した作りにはなってしまうと思います。
なので引数なしコンストラクタを作って、"使うな"とでも明記しとけば良い話ではあるのですが。
またSingletonのようなコンストラクタをprivate宣言しているものまで対応しなければならないので、気持ち悪い話ですがね。


追記:
>FlowLayoutPanelにアセンブリが持っているフォームを追加したいのです。
正確にはアセンブリが持っているフォームのレイアウト情報から生成したダミーフォームを追加します。
そのためにインスタンスが必要です。
InitializeCompornent()を解析してレイアウト情報を取得できるならインスタンスはいらないです。
引用返信 編集キー/
■33585 / inTopicNo.5)  Re[3]: コンストラクタの動的定義
□投稿者/ よねKEN (285回)-(2009/03/05(Thu) 09:32:48)
とりあえず↓の関連質問ということでよろしいですか?
http://bbs.wankuma.com/index.cgi?mode=al2&namber=33406
上記のスレはあまり深くは読んでいません。

No33584 (デザパタ大好きっ子 さん) に返信
> >リフレクションの意味が違うような(^-^;
> 確かにリフレクションは動的にメタ情報を取得するために利用することが多いですが、
> 動的に型なども定義できるようですよ?あれ勘違いしてますかね?

新しいアセンブリを作ってそこに新しい型を定義することはできますが、
既存の型を改ざんするようなことはできないと思います。
#根拠となる出典を示せませんが、改ざんできない/あるいは改ざんされたらわかるような仕組みがあったと思います。

> >後、正当なコンストラクタを経由せずに生成できたインスタンスじゃ内部状態が正常かどうかも信用もできませんね。
>
> 内部状態は特に気にしていません。

内部状態を気にしないの意味がわかりません。
内部状態が不正であるということは、そのインスタンスに対して何も正常には操作できないかもしれないということです。
メンバに正しくアクセスできないとしたら、意味がないと思いますが・・・。
それともメンバに一切アクセスせずに何かの役に立つのでしょうか?

> >というか何がしたいのでしょう。
>
> FlowLayoutPanelにアセンブリが持っているフォームを追加したいのです。

「日本語で書かれている部分の取得」が目的なんだろうと思っているのですが、
そのために「FlowLayoutPanelにアセンブリが持っているフォームを追加したい」理由や
その結果、どういうことをやろうとしているのかがよくわかりません。

> 最終的にはこれを多言語対応に使います。
> リリース後の既存アセンブリから例えば日本語で書かれている部分を英語に置き換えていきます。

既存のアセンブリそのものを書き換えるとおっしゃってますか?
それともファイル自体の置き換えですか?
前者だとアセンブリを改ざんしたいと言っているのと同じだと思うので、無理じゃないでしょうか。

> 置き換えた情報は外部に保存しておき、アセンブリがロード時に言語情報を読み込みます。

最初から外部に情報を用意すればいいのでは?

> 最後の仕組みはアセンブリ側に用意するつもりでしたので、多言語対応を意識した作りにはなってしまうと思います。
> なので引数なしコンストラクタを作って、"使うな"とでも明記しとけば良い話ではあるのですが。
> またSingletonのようなコンストラクタをprivate宣言しているものまで対応しなければならないので、気持ち悪い話ですがね。

ごめんなさい。おっしゃっていることがわかりません。
そもそものアプリの作りとして、言語情報は一箇所に固まっていないのですか??

引用返信 編集キー/
■33591 / inTopicNo.6)  Re[4]: コンストラクタの動的定義
□投稿者/ デザパタ大好きっ子 (13回)-(2009/03/05(Thu) 10:53:48)
No33585 (よねKEN さん) に返信
> とりあえず↓の関連質問ということでよろしいですか?
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=33406
> 上記のスレはあまり深くは読んでいません。

発想の基点にはなっていますが、質問としては別件です。
読む必要はないかなと思っています。

>「日本語で書かれている部分の取得」が目的なんだろうと思っているのですが、
>そのために「FlowLayoutPanelにアセンブリが持っているフォームを追加したい」理由や
>その結果、どういうことをやろうとしているのかがよくわかりません。

レイアウト情報を用いてFlowLayoutPanelの中に仮想フォームを作ります。
ユーザ(開発者ではなく翻訳者といった方が良いかな)はフォームを見ながら適切な英語に置き換えます。単に対応表を翻訳するのではなく、実際のアプリケーションのどこにその表示が現れるのかをイメージしながら翻訳できるのがミソです。

>既存のアセンブリそのものを書き換えるとおっしゃってますか?
>それともファイル自体の置き換えですか?
>前者だとアセンブリを改ざんしたいと言っているのと同じだと思うので、無理じゃないでしょうか。

アセンブリは置き換えません。言語情報は外部に保存します。

>最初から外部に情報を用意すればいいのでは?

上でミソといっていることがしたいがために試みていることなので、
実現不可能な場合はその方法ですね。
ただ、すでに今回の仕組みの大まかな実装はできており、うまいこと言語の置き換えができることも確認済みです。コンストラクタない場合はどうするを考慮してなかったので質問してみました。
#今のところ引数なしコンストラクタを用意することで対処していく予定です。

>ごめんなさい。おっしゃっていることがわかりません。

余談に近いのであまり気にしてもらわなくてもいいのですが、どこが疑問なのかがわからないです。

>そもそものアプリの作りとして、言語情報は一箇所に固まっていないのですか??
一箇所に固める予定です。現在は同じフォルダにあるexe,dllを一つのアプリケーションを構成する要素と認識していっぺんに読み込む仕様となっています。
アセンブリごとに言語ファイルができるわけではありません。
ただ、プラグインなど別フォルダに配置されそうなアセンブリにどう対処するかは未定です。

引用返信 編集キー/
■33593 / inTopicNo.7)  Re[5]: コンストラクタの動的定義
□投稿者/ デザパタ大好きっ子 (14回)-(2009/03/05(Thu) 10:56:15)
できないということがわかったのでこの質問は解決済みとしておきます。orz
解決済み
引用返信 編集キー/
■33595 / inTopicNo.8)  Re[5]: コンストラクタの動的定義
□投稿者/ よねKEN (286回)-(2009/03/05(Thu) 11:09:43)
2009/03/05(Thu) 11:20:35 編集(投稿者)

> >ごめんなさい。おっしゃっていることがわかりません。
>
> 余談に近いのであまり気にしてもらわなくてもいいのですが、どこが疑問なのかがわからないです。

質問の内容を読んで、ずばりな解決策はなさそうだなと直感的に思ったので、
何をしたいのだろう?と背景が気になりました。背景がわからないので質問の意図が読めなかった、ということです。

>> レイアウト情報を用いてFlowLayoutPanelの中に仮想フォームを作ります。
>> ユーザ(開発者ではなく翻訳者といった方が良いかな)はフォームを見ながら適切な英語に置き換えます。
>> 単に対応表を翻訳するのではなく、実際のアプリケーションのどこにその表示が現れるのかを
>> イメージしながら翻訳できるのがミソです。

を読んで、やりたいことと質問内容が結びつきました。
この背景の説明が欲しかった情報です。

翻訳者のためのサポートツールまで用意しようという着想だったのですね。
単なる案のレベル(実現性の検証なし)ですが、以下のような方向性はどうでしょうか。

翻訳者のサポートのためだけのアセンブリを作成します。
ソースコードも存在する状況だと思うので、ビルド時に各クラスに引数なしコンストラクタがない場合は、
自動的に生成してそれをビルドするとかすればよいような気がします。
例えば、Visual StudioのAdd-inの形でツールを作成、コンパイル条件により翻訳者向けアセンブリを作成するときは、
引数なしコンストラクタを補完してやるような感じ。

実現性もまったく検証していない妄想に近い案なので、無理そうだなという感じだったら、
軽くスルーしてください。


解決済み
引用返信 編集キー/
■33599 / inTopicNo.9)  Re[6]: コンストラクタの動的定義
□投稿者/ デザパタ大好きっ子 (15回)-(2009/03/05(Thu) 11:37:19)
No33595 (よねKEN さん) に返信
>翻訳者のサポートのためだけのアセンブリを作成します。
>ソースコードも存在する状況だと思うので、ビルド時に各クラスに引数なしコンストラクタがない場合は、
>自動的に生成してそれをビルドするとかすればよいような気がします。
>例えば、Visual StudioのAdd-inの形でツールを作成、コンパイル条件により翻訳者向け>アセンブリを作成するときは、
>引数なしコンストラクタを補完してやるような感じ。

なるほど、その発想はありませんでした。
ちょっと考えてみようと思います。
どうもありがとうございました。
解決済み
引用返信 編集キー/
■33648 / inTopicNo.10)  Re[7]: コンストラクタの動的定義
□投稿者/ Jitta on the way (282回)-(2009/03/05(Thu) 21:56:43)
同じアセンブリの中での話だと思っていました。違うアセンブリであれば、コンパイルして動的にロードするとか。
解決済み
引用返信 編集キー/
■33654 / inTopicNo.11)  Re[8]: コンストラクタの動的定義
□投稿者/ デザパタ大好きっ子 (20回)-(2009/03/05(Thu) 23:53:50)
2009/03/06(Fri) 01:05:27 編集(投稿者)

No33648 (Jitta on the way さん) に返信
> 同じアセンブリの中での話だと思っていました。違うアセンブリであれば、コンパイルして動的にロードするとか。

違うアセンブリでの話ですね。
むむ、動的にロードとは、アセンブリを読み込んでインスタンスを生成しようとした私の最初の考えと何か違うのでしょうか?

追記:
失礼。上記のことはちゃんと明記してませんでした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -