Visual Studioのデバッグ&ツールの基本②

ウォッチウィンドウなどでオブジェクトの確認は容易になりますが、ウォッチでは見えていても中には、そのまま思うように取り出せないものがあります。
ここでは、それを取り出してソース上に出力させる例を紹介します。

ウォッチした値の参照と出力

ASP.NET(C#)でのPage_Loadでの「sender」引数を例に説明していきます。

処理を停止させsenderをウォッチに入れ展開を行うと上記が表示されますが、この中の「AppRelativeVirtualPath」プロパティ値を出力させてみます。
実のところ各イベントの「sender」は、イベントの基底クラスのオブジェクトが入っており、Page_Loadの基底クラスはPageクラスなので、

string vPath = Page.AppRelativeVirtualPath;

と書けば完了ですが、ここでは敢えて回り道をしてウォッチ情報を頼りに出力までの道のりを辿ります。

まずは「イミディエイト」へ出力

senderは「object型」なので、

sender.AppRelativeVirtualPath

と書いても、objectクラスに無いものなので当然イミディエイトでも出力できません。
出力させるには、 senderをAppRelativeVirtualPathを持っているクラスで取り出す必要があります。
ウォッチのsender行を見てみると以下のようになっています。

sender 値: {ASP.default_aspx} 種類:object {ASP.default_aspx}

この「種類」がsenderの種類を表していますが、期待していた「Pageクラス」ではありません。一先ずこのまま素直にイミディエイトで以下のように、このクラスから取り出してみると・・・

(sender as ASP.default_aspx).AppRelativeVirtualPath
~/Default.aspx

と無事出力させることができました。

次にソースで出力

しかし、上記をそのままソースに書いても「’ASP’が見つかりませんでした」と残念なエラーが返ってきます。

string vPath = (sender as ASP.default_aspx).AppRelativeVirtualPath;

「参照の追加」を覗いて見てもそれらしい情報は判らず深くは遡及していませんが、これは一先ず無視してイミディエイトで「ASP.default_aspx 」を「typeof」して が何者か調べてみます。

typeof(ASP.default_aspx)
{Name = “default_aspx” FullName = “ASP.default_aspx”}
Assembly: {App_Web_d4jm13f5, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null}
AssemblyQualifiedName: “ASP.default_aspx, App_Web_d4jm13f5, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”
Attributes: Public | BeforeFieldInit
BaseType: {Name = “_Default” FullName = “xxxxxxx_example._Default”}

この結果から、BaseType(基底クラス)に「xxxxxxx_example._Default」というものがあるので今度はこれを試してみます。

string arvPath = (sender as xxxxxxx_example._Default).AppRelativeVirtualPath;

今度はarvPath に「~/Default.aspx」を出力させることができました。

しかし、基底クラスが「Pageクラス」では無く納得感がないので更に基底クラスをイミディエイトで掘ってみます。

typeof(ASP.default_aspx).BaseType.BaseType
{Name = “Page” FullName = “System.Web.UI.Page”}

「System.Web.UI.Page」が出てきました。これで納得です。

こんな感じでウォッチ情報を元に出力できますが、モノによっては特殊なコーディングになるので合わせてヘルプなども見ておくのが良いでしょうか。

<< Visual Studioのデバッグ&ツールの基本①

Visual Studioのデバッグ&ツールの基本③ >>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

17 + 16 =