スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

AはBである

AはBである
このインスタンス(A)はクラスBである。
class B {
//...
}
var A = new B();
var aIsB = A is B;//当然true

このインスタンス(A)はインターフェイスCである。
interface C {
//...
}
class B : C {
//...
}
var A = new B();
var AIsC = A is C;//true

インスタンスではなくタイプを使う(タイプのみ与えられる)場合

class C {
//...
}
class B : C {
//...
}
var A = new B();
var AIsExtendFromC = typeof(C).IsAssignableFrom(A.GetType());//true
var D = new C();
var DIsExtendFromC = typeof(C).IsAssignableFrom(D.GetType());//true

めんどくさいのはGenericが使用されている場合だった。仕事上、「Nullable<>を継承した値型のインスタンスかどうか?」を知りたい状況があった。

int? A = 3;
var AisNullableInt = A is Nullable<int>;//true
なんだけど、もっと大きいグループで比較したかった(int?とかdecimal?は、Nullable<int>やNullable<decimal>なので、より抽象っぽい「Nullable<>かどうか?」を知りたい)。これをどうするれば、思うような結果が得られるかで結構悩んだ。結果的には、↓のような感じになる。

var isNullable1 = typeof(Nullable<>).IsAssignableFrom(
typeof(int?).GetGenericTypeDefinition());//true
var isNullable2 = typeof(Nullable<>).IsAssignableFrom(
typeof(decimal?).GetGenericTypeDefinition());//true
これを利用することで、プロパティの型がNullable<>系かどうかがわかったりする。

class C {
public int? MyProperty {get; set;}
}

var propInfo = typeof(C).GetProperty("MyProperty");
var isNullable = typeof(Nullable<>).IsAssignableFrom(
propInfo.PropertyType.GetGenericTypeDefinition());//true
ただし、GenericではないTypeでGetGenericTypeDefinition()を呼び出すと、InvalidOperationExceptionを発生させるので、条件なしで使用というのは難しい。なので、厳密には

var propInfo = typeof(C).GetProperty("MyProperty");
if (propInfo.PropertyType.IsGenericType) {
var isNullable = typeof(Nullable<>).IsAssignableFrom(
propInfo.PropertyType.GetGenericTypeDefinition());
}
となる。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。