回答:
どうやら、違います。
オプションは次のとおりです。
is
そして as
あなたがすでに知っているように、これは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
は(明らかに)それ自体のサブクラスではありません。
これで、特定の質問に答えることができますが、誤検知も発生します。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
ご質問の文脈では、彼らが持つ作業コード内で直接型のオブジェクトと書き込み1を操作するためにあなたを必要としないことである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;
}
IsInstanceOfType
適合しますか?
代わりにType.IsAssignableFromを使用してみてください。
Xamarin Forms PCLプロジェクトでそれを実行しようとしている場合、上記のソリューションを使用IsAssignableFrom
するとエラーが発生します。
エラー: 'Type'には 'IsAssignableFrom'の定義が含まれておらず、タイプ 'Type'の最初の引数を受け入れる拡張メソッド 'IsAssignableFrom'が見つかりません(usingディレクティブまたはアセンブリ参照がありませんか?)
オブジェクトをIsAssignableFrom
要求するからTypeInfo
です。次のGetTypeInfo()
方法を使用できますSystem.Reflection
。
typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
私はこの答えを投稿します。誰かが私にそれを共有することを期待しています。私のアプリケーションには、typeof(A)またはtypeof(B)であることを確認するために確認したいTypeのプロパティがあります。BはAから派生したクラスです。
public class A
{
}
public class B : A
{
}
public class MyClass
{
private Type _helperType;
public Type HelperType
{
get { return _helperType; }
set
{
var testInstance = (A)Activator.CreateInstance(value);
if (testInstance==null)
throw new InvalidCastException("HelperType must be derived from A");
_helperType = value;
}
}
}
私はここでは少し世間知らずかもしれないので、どんなフィードバックでも歓迎します。