2011年11月26日

NullableのオブジェクトのGetType()で得られる値は

   このエントリーをはてなブックマークに追加 Clip to Evernote

以下のコードの変数 t って、Nullable<Decimal> の型情報が入るのかと思ったら、
Decimalの型情報が入るんだ。

そういえば前にも同じようなことで悩んだ気がするけど...
まあ、実際はこんなコードが必要になる場面は無いだろうけどね。


  

Posted by gushwell at 11:30Comments(2)TrackBack(0)

2010年09月26日

現在実行中のメソッド名を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
System.Reflection.MethodBase.GetCurrentMethod()は、現在実行中のメソッドを表す MethodBase オブジェクトを返します。

Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。

以下、C#の簡単な例です。


結果は、

button1_Click
Sample.Form1

と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。   
Posted by gushwell at 23:19Comments(0)TrackBack(0)

2010年07月06日

あるオブジェクトが派生型かどうかを知りたい

   このエントリーをはてなブックマークに追加 Clip to Evernote


というクラスがあった時に、
あるオブジェクトの型が、BaseClassの派生型かどうかを調べるコードをC#で書きたい場合がたまにあります。


だと、obj が BaseClassのインスタンスでも、この if 文が成り立ってしまうので宜しくないです。


だと、ちょっとダサい。
そんなときは、そのものずばりのメソッド IsSubclassOf を使います。

  
Posted by gushwell at 23:01Comments(0)TrackBack(1)

2010年01月31日

エントリ・ポイントを含むアセンブリ(Assemblyオブジェクト)を取得

   このエントリーをはてなブックマークに追加 Clip to Evernote
以下は、現在実行されているアセンブリのバージョンを得るコードです。


GetName() というメソッド名が紛らわしいんですよね。
GetName()で返るのは、文字列ではなく、System.Reflection.AssemblyName クラスの インスタンスです。

GetExecutingAssembly の代わりに、GetEntryAssembly を使えば、 エントリポイント(Mainメソッド)を含むアセンブリの情報を取得できます。
クラスライブラリ側で、実行中のexeのアセンブリ情報を利用したい場合に使えます。
以下のコードは、バージョン情報を得るコードです。


もちろん、そのパス名や、アセンブリ表示名も取得できます。


  
Posted by gushwell at 23:39Comments(0)TrackBack(0)

2009年07月12日

どのインターフェースを実装しているのか知りたい

   このエントリーをはてなブックマークに追加 Clip to Evernote
リフレクション:interfaceの情報を得るの続きです。

Type.GetInterfacesメソッドを使うと、ある型がどういったインターフェースを実装しているかを調べることもできます。



以下、実行結果です。


このコードの中で、IsGenericType プロパティを使っていますが、これで、ジェネリッククラスから構築された型かどうかを知ることができます。
その他、Isで始まるプロパティがたくさんあります。

しかし、IsArrayはありますが、IsListはありません。まあ当たり前といえば当たり前ですね。
で、書いてみました。
拡張メソッドにしても良いかも知れませんね。

  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2009年07月07日

リフレクション:interfaceの情報を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
リフレクションの機能を使うと、ある型が、特定のインターフェースに対して、どういったメソッドを実装しているかを知ることができます。


この実行結果は、


となります。get_で始まるメソッドは、プロパティに対応しています。
  
Posted by gushwell at 23:59Comments(0)TrackBack(0)

2009年04月07日

TypeCode 列挙体

   このエントリーをはてなブックマークに追加 Clip to Evernote
前にも書いたような気もするけど、
GetTypeCodeを使うと、その型の TypeCodeを取得できます。

 static void Foo(object c) {
TypeCode code = Type.GetTypeCode(c.GetType());
Console.WriteLine(code);
}


TypeCode 列挙体 は、

TypeCode.Boolean
TypeCode.Char
TypeCode.Int16
TypeCode.Int32
TypeCode.Double
TypeCode.Decimal
TypeCode.DateTime
TypeCode.String

などの値があります。switch文等で分岐したいときに使えます。

 if (type == typeof(System.Int16)) {


などと、型比較するよりも速度が速いです。
こういったミクロな視点での速度を云々言うのは好きではないですが...  
Posted by gushwell at 23:17Comments(0)TrackBack(1)

2008年11月22日

IsVirtual と IsFinal

   このエントリーをはてなブックマークに追加 Clip to Evernote
MethodInfoには、IsVirtualプロパティがあるけど、これが trueだからって、オーバーライドできるとは限らないみたい。

あるインターフェースを実装したクラスの当該メソッドは、共通言語ランタイムでは、virtual としてマークしなくちゃいけないので、特別に、virtual final としてマークするようです。

なので、IsVirtula == true かつ IsFinal == false
じゃないと、実際にはオーバーライドできないということです。

  
Posted by gushwell at 17:49Comments(3)TrackBack(0)