質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3115閲覧

C#でmethodの中身を取得したいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/01/06 09:41

こんにちは。
Windows10でC#のアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
methodの中身を取得したいです。

###試したこと
System.Refrectionを使って、MethodInfoを取得しました。
miを見ていて、returnとかnameとかは見つかるのですが、Methodの中身は見当たらないです。
ひょっとして、Methodの中身は見られないですか?

###発生している問題・エラーメッセージ
ひょっとして、Methodの中身は見られないですか?

###該当のソースコード

C#

1Type type = GetType(); 2MethodInfo mi = type.GetMethod("name");

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/01/06 10:02

Methodの中身って、Methonのコード(C#言語を書かれたプログラム)の事ですか? オブジェクトコード(ソースコードをコンパイルして得られたコード)にはソースコードが含まれていないので、オブジェクトコードを実行中にソースコードを知ることは出来ません。
guest

回答2

0

ベストアンサー

こんにちは。

「メソッドの中身」とは何のことを言っていますか?
メソッドのソースコード文字列や文中の制御構文レベルの話であれば、それはコンパイル時にCILに変換されてしまっているため、入手することはできません。
MethodInfoで入手できるのは、コンパイルされたメソッドに付随するメタ情報です。メソッドの名前、引数の配列、戻り値の型、定義されているクラス情報などです。頑張ればメソッド本文のバイナリ状態の命令列を入手することはできます。

質問に書かれている「メソッドの中身」というのが何のことを指していて、それを何に使いたいのかが分かれば、もう少し詳細な回答ができると思います。

投稿2017/01/08 06:54

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/01/10 02:08 編集

ありがとうございます。 xamlでimageを複数配置した。 methodのなかで、使うimageを設定した。 methodA-imageA, imageB methodB-imageC, imageD methodC-imageA, imageG さて、imageAを使うように設定したmethodはどれでしょう? という状態で、ということはmethod内の表示の設定を見るか、ということです。 private void MethodA(){ imageA.Visiblity = Visiblity.Visible; } としているimageA.Visibility = Visibility.Visible;を取得したいです。 MethodAを使うときに、どのimageを見えるようにしたのかを知りたいです。
tamoto

2017/01/10 01:43

ちょっと情報が足りないので見当違いな可能性もありますが…… imageAがMethodAの中に「ハードコーディング」されているのに、それを外から取得したいというのは通常C#でやるようなことではないですね。 「メソッド内で○○を使った」を後々確認したい場面があるなら、そもそも○○はメソッドにハードコーディングせず、引数で与えるようにするべきでしょう。 そうすれば、「methodAに与えたimageN」という形でコード内で参照できるようになるはずです。
cancat

2017/01/10 02:01

なるほど。それはそうだとは思うのですが。さて。 引数で渡すか(渡すものが多いので悩む)、returnにobjectで入れるか。 どちらかしかないということですね。。。
tamoto

2017/01/10 02:12

想像での回答ですが、 MethodAが持つパラメータが多数であり、MethodA自体が独立して意味を持つ状態になっているなら、新しいクラスを一つ作り、その中にMethodAを設置し、同時にMethodAが使用する各パラメータをプロパティとして定義し公開する、というのはどうでしょう。 質問では「MethodA」のように名前の意味を失わせるマスキングが行われているため、細かい点にフォーカスした情報を小出しにされても、これ以上適切な回答をすることは難しいと思います。
cancat

2017/01/10 06:19

そうですね。 methodの中身をとれない、ということを知り、引数とreturnを検討した結果、Programではなく、データに情報を持たせることにしました。 小出しにしたのは意図したことではなく、抽象的な質問にしたい、という意図です。 じっくり1時間くらい対面でお話しできれば、とは思いますが、まあそれはそれとして、おかげで解決できました。 MethodA,B,C.....(30種類くらい?)のパラメータをどう扱うかは、設計時にいろいろ検討したのですが、コード量を減らして扱いやすくするようにしたつもりで、クラスにするほどではない、と考えています。MethodA, B, C...をまとめたCore-classを作っています。 これ以上説明しても、きりがないので・・・。すみません。 ともあれ、大いに参考になりました。大感謝です。
tamoto

2017/01/10 07:06

ややお節介は承知でコメントします。 オブジェクト指向プログラミングにおいて「名前」というのは非常に重要であり、質問回答の際に変数やメソッドの名前がわかるだけでも最初に提案できる解決法の品質が大幅に上がります。質問で解決したい事柄に対して、「この方法で解決する」と決めつけて、その他の情報をカットしてしまうと、より良い提案ができる可能性が失われてしまいます。質問時に実際の名前から抽象化するのは悪いことではないですが、「method」のレベルまで意味を失わせてしまうのはやり過ぎなのです。 今回の質問の場合、解決したい事柄「メソッドで使用しているインスタンスの情報を取得したい」に対して「リフレクションで解決する」と決めつけてその他の情報を削ってしまっているため、実際に役立ててもらえる内容がコメント欄に書かれる事態になってしまっています。可能ならば、質問の時点で「何を実現したくて、このやり方を知りたい」のかが分かるようなっていればとても助かります。
cancat

2017/01/11 04:29

かしこまりました。もちろん、名前の重要性は充分に理解しているつもりです。 プログラミングとは命名のことだ、と思っているくらいです。 抽象化するのは、簡単そうで、むずかしいです。 引き続きよろしくお願いいたします。
guest

0

メソッドのILあるいはJITがコンパイルした結果のネイティブコード(機械語)を実行時に見る目的はなんでしょうか?デバッグ目的ならそうしたメタな情報を調べるにはランタイムの情報ではなく逆アセンブルをしたり普通にデバッガーに頼った方がいいように思います。

どうしても見る必要があるならMethodInfoがどう実装されているかの非公開情報を自分で調べてUnmanagedコードを介してアクセスするといった方法になる気がします。(詳しくないのでそれでできるかどうかはわかりませんが)

投稿2017/01/06 10:17

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/01/10 01:30

ありがとうございます。 目的を説明し始めるととても長くなるので、ひとことでは説明しがたいのです。 xamlでimageを複数配置した。 methodのなかで、使うimageを設定した。 methodA-imageA, imageB methodB-imageC, imageD methodC-imageA, imageG さて、imageAを使うように設定したmethodはどれでしょう? という状態で、ということはmethod内の表示の設定を見るか、ということです。 たぶん、これだけでは書ききれない、たくさんの条件や制約があり、聞かれるたびにどんどん長くなります。
KSwordOfHaste

2017/01/10 04:58

なるほど・・・そういった情報をリフレクションで得ようとするのにはちょっと無理があるようです。むしろそれがわかるようなプログラムの構造にすべきとだけコメントしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問