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

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

ただいまの
回答率

90.84%

  • C#

    5987questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 479

cancat

score 239

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

前提・実現したいこと

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

試したこと

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

発生している問題・エラーメッセージ

ひょっとして、Methodの中身は見られないですか?

該当のソースコード

Type type = GetType();
MethodInfo 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 

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/01/06 19:02

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

    キャンセル

回答 2

checkベストアンサー

+1

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/10 11: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を見えるようにしたのかを知りたいです。

    キャンセル

  • 2017/01/10 10:43

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

    キャンセル

  • 2017/01/10 11:01

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

    キャンセル

  • 2017/01/10 11:12

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

    キャンセル

  • 2017/01/10 15:19

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

    ともあれ、大いに参考になりました。大感謝です。

    キャンセル

  • 2017/01/10 16:06

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

    キャンセル

  • 2017/01/11 13:29

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/10 10:30

    ありがとうございます。
    目的を説明し始めるととても長くなるので、ひとことでは説明しがたいのです。

    xamlでimageを複数配置した。
    methodのなかで、使うimageを設定した。
    methodA-imageA, imageB
    methodB-imageC, imageD
    methodC-imageA, imageG
    さて、imageAを使うように設定したmethodはどれでしょう?
    という状態で、ということはmethod内の表示の設定を見るか、ということです。

    たぶん、これだけでは書ききれない、たくさんの条件や制約があり、聞かれるたびにどんどん長くなります。

    キャンセル

  • 2017/01/10 13:58

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    visual studio 2010と2013の違い

    いつもお世話になっております。 C言語で作ったプログラムをVisual Studio 2010と2013で起動し、挙動を比較したところ、同じ挙動にならなかったことに疑問を持ち

  • 解決済

    Visual Basic

    前提・実現したいこと Visual Basicにて、Excelを操作するプログラムを作成しており、ボタンをクリックした際に指定したセルに移動して値を入力する機能を実装したいのです

  • 解決済

    C#のcomboboxの要素による条件分岐

    現在C#を用いて、 マウスのドラッグで矩形を描くプログラムを作成しています。 描く矩形の形は、comboboxによって変えようと思います。 ObjSelectFrm.cs

  • 解決済

    C++/MFCでReleaseモード時のみ値が不定になってしまう

     前提・実現したいこと Visual Studio 2013を用いて、C++/MFCアプリケーションを開発しています。 とあるプロジェクトにおいて、Releaseモードのみ発生

  • 解決済

    VisualStudioでprojectCにAとBを参照で追加したいです。

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

  • 受付中

    Microsoft Visual Studioでのerror (C#)

    前提・実現したいこと Visual Studioを使っているのですが、Console.WriteLineの行でエラーが発生します。 考えられる対処法はないでしょうか 当方プログラミ

  • 解決済

    ListBox(WPF)で各アイテムに連番を与える方法

    お世話になっております。 行いたいこと ListBoxのitemに連番を振りたいと思っています。 ListBoxの並び替え(過去の質問)機能を実装しているので、順番が変われば値

  • 解決済

    Natvisをcmakeで認識してvsのprojectに追加する方法

    Visual Studioのデバッガでの表示をカスタマイズするものとしてNatvisがあるわけですが、   Create custom views of native object

同じタグがついた質問を見る

  • C#

    5987questions

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