オブジェクトが特定のタイプではないかどうかを確認したいと思います。私は何かが特定のタイプであるかどうかをチェックする方法を知っています:
if (t is TypeA)
{
...
}
しかし
if (t isnt TypeA)
{
...
}
動作しません。
更新2020-10-30:
時代は変わりつつあります。C#9.0以降では、より自然な方法で確認できます。
if(t is not TypeA) { ... }
元の回答:
C#は完全に自然言語ではありません;)これを使用してください
if(!(t is TypeA))
{
...
}
チェックするだけでなく、演算子として使用することもできます。
var a = t as TypeA;
if(a!= null)
//use a..
このように、チェック後にタイプを使用する場合は、ダブルキャストを回避します。
TypeA x = (TypeA)t;
ifブロック内で実行している場合は、より良い方法があります
TypeA x = t as TypeA
if(x != null)
{
...
}
これにより、2回ではなく、1回だけタイプチェックが行われます。
救助への拡張メソッド!!
public static class ObjectExtensions
{
public static bool Isnt(this object source, Type targetType)
{
return source.GetType() != targetType;
}
}
使用法
if (t.Isnt(typeof(TypeA)))
{
...
}
簡単な答え:あなたは使用したいかもしれません:
if (t.GetType()==typeof(TypeA))
{
...
}
if (t.GetType()!=typeof(TypeA))
{
...
}
長い答え:
それで。それが特定のタイプであるかどうかを尋ねていることに注意してください。 is
それが特定のタイプであるかどうかはわかりません-それが特定のタイプであるか、そのタイプの子孫であるかを示します。
つまり、AnimalとCat:Animalの2つのクラスがあり、felixが猫である場合、
if (felix is Animal)
{
//returns true
}
if (felix.GetType() == typeof(Animal))
{
//does not
}
それがあなたにとって重要でないなら、継承されたクラスは大丈夫です、そしてそれについて心配しないでください、!(felix is Animal)
他の人が述べたように使ってください、そしてあなたは大丈夫です!(おそらく大丈夫です。)
ただし、felixが具体的に動物であることを確認する必要がある場合は、を尋ねる必要がありますt.GetType()==typeof(TypeA)
。
私は通常、nullとタイプチェックをすべて1行で貼り付けます。
if (t == null || !(t is TypeA)) {
...
}
TypeAが構造体の場合は、少し異なる方法で処理する必要があります。
if (t == null || t.GetType() != typeof(TypeA)) {
...
}
以下の例を確認してくださいgetType()
:
object obj = new object();
obj.GetType();
string s;
s.GetType();
List<string> StringList = new List<string>();
StringList.GetType();