[解決済み】ある型がサブタイプかオブジェクトの型かを確認するにはどうすればいいですか?
質問
C#で、ある型が他の型のサブクラスであるかどうかを確認するのは簡単です。
typeof (SubClass).IsSubclassOf(typeof (BaseClass)); // returns true
ただし、これは失敗します。
typeof (BaseClass).IsSubclassOf(typeof (BaseClass)); // returns false
ある型がサブクラスであるか、あるいはベースクラスそのものであるかどうかを
OR
演算子を使用するか、拡張メソッドを使用する必要がありますか?
どのように解決するのですか?
どうやら、ダメみたいです。
オプションはこちらです。
- 使用する タイプ.IsSubclassOf
- 使用方法 タイプ.IsAssignableFrom
-
is
とas
タイプ.IsSubclassOf
すでにお分かりのように、2つのタイプが同じである場合、これは機能しませんので、以下にサンプルを示します。 LINQPad のプログラムで実証しています。
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
出力します。
True
False
ということを表しています。
Derived
のサブクラスです。
Base
が、その
Base
は(明らかに)それ自身のサブクラスではありません。
タイプ.IsAssignableFrom
さて、これはあなたの特定の質問に答えるものですが、同時に偽陽性を与えることになります。Eric Lippertがコメントで指摘しているように、このメソッドは確かに
True
を返しますが、上記の2つの質問に対しては
True
は、おそらく必要ないでしょう。
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
ここでは、次のような出力が得られます。
True
True
True
最後の
True
は、もしメソッド
のみ
は、質問されたことに答えると
uint[]
を継承しています。
int[]
とか、同じ型であるとか、明らかに違いますよね。
そこで
IsAssignableFrom
も完全に正しいとは言えません。
is
と
as
に関する問題点"。
is
と
as
を使うのではなく、オブジェクトを操作して、コードの中で直接型の一つを書く必要があるということです。
Type
オブジェクトを作成します。
つまり、これではコンパイルできない。
SubClass is BaseClass
^--+---^
|
+-- need object reference here
また、これもそうでしょう。
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
また、これもそうでしょう。
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
まとめ
上記の方法はあなたのニーズに合うかもしれませんが、あなたの質問に対する唯一の正しい答えは(私が見る限り)、追加のチェックが必要になるということです。
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
もちろん、メソッドの方がより理にかなっています。
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}
関連
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] enumを列挙するには
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] JavaScriptで値がオブジェクトであるかどうかを確認する
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] あるクラスが他のクラスをインスタンス化せずに継承しているかどうかを確認する方法は?重複