5

タイプがRunTimeTypeタイプであるかどうかを確認するにはどうすればよいですか?私はこれを機能させていますが、それは一種の厄介です:

    private bool IsTypeOfType(Type type)
    {
        return type.FullName ==  "System.RuntimeType";
    }
4

3 に答える 3

8

オブジェクトがクラスをType記述しているかどうかを実際に知りたいと思いますが、オブジェクトはそうではなく、そうでないため、比較は失敗します。TypeTypetypeof(RuntimeType)typeof(Type)typeof(Type)

あなたができることは、Typeオブジェクトによって記述されたタイプのインスタンスがタイプの変数に割り当てられることができるかどうかをチェックすることですTypeRuntimeTypeから派生するため、これにより望ましい結果が得られ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
于 2012-04-17T00:51:00.583 に答える
0

本当に、唯一の問題はそれ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フィドルを動作させます。

于 2019-11-25T12:05:00.163 に答える
-1
return type == typeof(MyObjectType) || isoftype(type.BaseType) ;
于 2012-04-17T00:47:43.420 に答える