タイプがRunTimeTypeタイプであるかどうかを確認するにはどうすればよいですか?私はこれを機能させていますが、それは一種の厄介です:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
タイプがRunTimeTypeタイプであるかどうかを確認するにはどうすればよいですか?私はこれを機能させていますが、それは一種の厄介です:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
オブジェクトがクラスをType
記述しているかどうかを実際に知りたいと思いますが、オブジェクトはそうではなく、そうでないため、比較は失敗します。Type
Type
typeof(RuntimeType)
typeof(Type)
typeof(Type)
あなたができることは、Type
オブジェクトによって記述されたタイプのインスタンスがタイプの変数に割り当てられることができるかどうかをチェックすることですType
。RuntimeType
から派生するため、これにより望ましい結果が得られType
ます。
private bool IsTypeOfType(Type type)
{
return typeof(Type).IsAssignableFrom(type);
}
Type
クラスを説明するオブジェクトを本当に知る必要がある場合Type
は、GetTypeメソッドを使用できます。
private bool IsRuntimeType(Type type)
{
return type == typeof(Type).GetType();
}
ただし、のでtypeof(Type) != typeof(Type).GetType()
、これを避ける必要があります。
例:
IsTypeOfType(typeof(Type)) // true
IsTypeOfType(typeof(Type).GetType()) // true
IsTypeOfType(typeof(string)) // false
IsTypeOfType(typeof(int)) // false
IsRuntimeType(typeof(Type)) // false
IsRuntimeType(typeof(Type).GetType()) // true
IsRuntimeType(typeof(string)) // false
IsRuntimeType(typeof(int)) // false
本当に、唯一の問題はそれSystem.RuntimeType
ですinternal
、それで次のような単純なことをします:
if (obj is System.RuntimeType)
コンパイルされません:
CS0122'RuntimeType'は、保護レベルが原因でアクセスできません。
したがって、上記の@dtbからの解決策は正しいです。彼らの答えを拡張する:
void Main()
{
object obj = "";
// obj = new {}; // also works
// This works
IsRuntimeType(obj.GetType()); // Rightly prints "it's a System.Type"
IsRuntimeType(obj.GetType().GetType()); // Rightly prints "it's a System.RuntimeType"
// This proves that @Hopeless' comment to the accepted answer from @dtb does not work
IsWhatSystemType(obj.GetType()); // Should return "is a Type", but doesn't
IsWhatSystemType(obj.GetType().GetType());
}
// This works
void IsRuntimeType(object obj)
{
if (obj == typeof(Type).GetType())
// Can't do `obj is System.RuntimeType` -- inaccessible due to its protection level
Console.WriteLine("object is a System.RuntimeType");
else if (obj is Type)
Console.WriteLine("object is a System.Type");
}
// This proves that @Hopeless' comment to the accepted answer from @dtb does not work
void IsWhatSystemType(object obj)
{
if (obj is TypeInfo)
Console.WriteLine("object is a System.RuntimeType");
else
Console.WriteLine("object is a Type");
}
ここで.NETフィドルを動作させます。
return type == typeof(MyObjectType) || isoftype(type.BaseType) ;