これが機能する理由
if (mycontrol.GetType() == typeof(TextBox))
{}
そして、これはしませんか?
Type tp = typeof(mycontrol);
しかし、これは動作します
Type tp = mycontrol.GetType();
私自身は型のチェックにis
演算子を使用していますが、typeof()
およびGetType()
を使用すると理解に失敗します
GetType()
またはtypeof()
を使用する場所とタイミング
typeof
は、compile-time(または少なくとも一般的な型パラメーター)で既知の型を取得する演算子です。 typeof
のオペランドは、常に型または型パラメーターの名前です-never値を持つ式(変数など)。詳細については、 C#言語仕様 を参照してください。
GetType()
は、オブジェクトのexecution-timeタイプを取得するために、個々のオブジェクトで呼び出すメソッドです。
onlyのみ(サブクラスのインスタンスではなく)TextBox
のインスタンスを正確に必要としない限り、通常使用することに注意してください。
if (myControl is TextBox)
{
// Whatever
}
または
TextBox tb = myControl as TextBox;
if (tb != null)
{
// Use tb
}
typeof
は、コンパイル時に既知の型またはジェネリック型パラメーターの名前に適用されます。 GetType
は、実行時にオブジェクトで呼び出されます。どちらの場合も、結果はタイプのメタ情報を含むタイプSystem.Type
のオブジェクトです。
あなたが持っている場合
string s = "hello";
これらの2行は有効です
Type t1 = typeof(string);
Type t2 = s.GetType();
t1 == t2 ==> true
しかし
object obj = "hello";
これらの2行は有効です
Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType(); // ==> string!
t1 == t2 ==> false
つまり、変数obj
のコンパイル時型(静的型)は、obj
によって参照されるオブジェクトのランタイム型と同じではありません。
テストタイプ
ただし、mycontrol
がTextBox
であるかどうかだけを知りたい場合は、単純にテストできます。
if (mycontrol is TextBox)
これは完全に同等ではないことに注意してください
if (mycontrol.GetType() == typeof(TextBox))
mycontrol
はTextBox
から派生した型を持つことができるためです。その場合、最初の比較ではtrue
と2番目のfalse
!が得られます。 TextBox
から派生したコントロールはTextBox
が持つすべてを継承し、おそらくそれをさらに追加するため、TextBox
との割り当て互換性があるため、ほとんどの場合、最初の簡単なバリアントは問題ありません。
public class MySpecializedTextBox : TextBox
{
}
MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox) ==> true
if (specialized.GetType() == typeof(TextBox)) ==> false
キャスティング
次のテストに続いてキャストがあり、TがNULL入力可能の場合...
if (obj is T) {
T x = (T)obj; // The casting tests, whether obj is T again!
...
}
...に変更できます...
T x = obj as T;
if (x != null) {
...
}
値が特定の型であるかどうかのテストとキャスト(この同じテストを再度含む)は両方とも、長い継承チェーンでは時間がかかる可能性があります。 as
演算子に続いてnull
のテストを使用すると、パフォーマンスが向上します。
C#7.0以降では、パターンマッチングを使用してコードを簡素化できます。
if (obj is T t) {
// t is a variable of type T having a non-null value.
...
}
is
キーワード を使用する方が簡単な場合があります。
if (mycontrol is TextBox)