2011年11月26日
NullableのオブジェクトのGetType()で得られる値は
以下のコードの変数 t って、Nullable<Decimal> の型情報が入るのかと思ったら、
Decimalの型情報が入るんだ。
そういえば前にも同じようなことで悩んだ気がするけど...
まあ、実際はこんなコードが必要になる場面は無いだろうけどね。
2010年09月26日
現在実行中のメソッド名を得る
System.Reflection.MethodBase.GetCurrentMethod()は、現在実行中のメソッドを表す MethodBase オブジェクトを返します。
Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。
以下、C#の簡単な例です。
結果は、
button1_Click
Sample.Form1
と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。
Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。
以下、C#の簡単な例です。
結果は、
button1_Click
Sample.Form1
と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。
2010年07月06日
あるオブジェクトが派生型かどうかを知りたい
というクラスがあった時に、
あるオブジェクトの型が、BaseClassの派生型かどうかを調べるコードをC#で書きたい場合がたまにあります。
だと、obj が BaseClassのインスタンスでも、この if 文が成り立ってしまうので宜しくないです。
だと、ちょっとダサい。
そんなときは、そのものずばりのメソッド IsSubclassOf を使います。
2010年01月31日
エントリ・ポイントを含むアセンブリ(Assemblyオブジェクト)を取得
以下は、現在実行されているアセンブリのバージョンを得るコードです。
GetName() というメソッド名が紛らわしいんですよね。
GetName()で返るのは、文字列ではなく、System.Reflection.AssemblyName クラスの インスタンスです。
GetExecutingAssembly の代わりに、GetEntryAssembly を使えば、 エントリポイント(Mainメソッド)を含むアセンブリの情報を取得できます。
クラスライブラリ側で、実行中のexeのアセンブリ情報を利用したい場合に使えます。
以下のコードは、バージョン情報を得るコードです。
もちろん、そのパス名や、アセンブリ表示名も取得できます。
GetName() というメソッド名が紛らわしいんですよね。
GetName()で返るのは、文字列ではなく、System.Reflection.AssemblyName クラスの インスタンスです。
GetExecutingAssembly の代わりに、GetEntryAssembly を使えば、 エントリポイント(Mainメソッド)を含むアセンブリの情報を取得できます。
クラスライブラリ側で、実行中のexeのアセンブリ情報を利用したい場合に使えます。
以下のコードは、バージョン情報を得るコードです。
もちろん、そのパス名や、アセンブリ表示名も取得できます。
2009年07月12日
どのインターフェースを実装しているのか知りたい
リフレクション:interfaceの情報を得るの続きです。
Type.GetInterfacesメソッドを使うと、ある型がどういったインターフェースを実装しているかを調べることもできます。
以下、実行結果です。
このコードの中で、IsGenericType プロパティを使っていますが、これで、ジェネリッククラスから構築された型かどうかを知ることができます。
その他、Isで始まるプロパティがたくさんあります。
しかし、IsArrayはありますが、IsListはありません。まあ当たり前といえば当たり前ですね。
で、書いてみました。
拡張メソッドにしても良いかも知れませんね。
Type.GetInterfacesメソッドを使うと、ある型がどういったインターフェースを実装しているかを調べることもできます。
以下、実行結果です。
このコードの中で、IsGenericType プロパティを使っていますが、これで、ジェネリッククラスから構築された型かどうかを知ることができます。
その他、Isで始まるプロパティがたくさんあります。
しかし、IsArrayはありますが、IsListはありません。まあ当たり前といえば当たり前ですね。
で、書いてみました。
拡張メソッドにしても良いかも知れませんね。
2009年07月07日
リフレクション:interfaceの情報を得る
リフレクションの機能を使うと、ある型が、特定のインターフェースに対して、どういったメソッドを実装しているかを知ることができます。
この実行結果は、
となります。get_で始まるメソッドは、プロパティに対応しています。
この実行結果は、
となります。get_で始まるメソッドは、プロパティに対応しています。
2009年04月07日
TypeCode 列挙体
前にも書いたような気もするけど、
GetTypeCodeを使うと、その型の TypeCodeを取得できます。
TypeCode 列挙体 は、
TypeCode.Boolean
TypeCode.Char
TypeCode.Int16
TypeCode.Int32
TypeCode.Double
TypeCode.Decimal
TypeCode.DateTime
TypeCode.String
などの値があります。switch文等で分岐したいときに使えます。
などと、型比較するよりも速度が速いです。
こういったミクロな視点での速度を云々言うのは好きではないですが...
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)) {
などと、型比較するよりも速度が速いです。
こういったミクロな視点での速度を云々言うのは好きではないですが...
2008年11月22日
IsVirtual と IsFinal
MethodInfoには、IsVirtualプロパティがあるけど、これが trueだからって、オーバーライドできるとは限らないみたい。
あるインターフェースを実装したクラスの当該メソッドは、共通言語ランタイムでは、virtual としてマークしなくちゃいけないので、特別に、virtual final としてマークするようです。
なので、IsVirtula == true かつ IsFinal == false
じゃないと、実際にはオーバーライドできないということです。
あるインターフェースを実装したクラスの当該メソッドは、共通言語ランタイムでは、virtual としてマークしなくちゃいけないので、特別に、virtual final としてマークするようです。
なので、IsVirtula == true かつ IsFinal == false
じゃないと、実際にはオーバーライドできないということです。