1. ホーム
  2. c#

[解決済み] IsAssignableFromと'open'ジェネリックタイプの使用について

2023-07-16 22:16:53

質問

リフレクションを使って、与えられた基底クラスから継承される型の集合を見つけようとしています。 それは単純な型のために理解するのに時間がかからなかったが、ジェネリックに来るとき、私はつまずいている。

このコード片では、最初の IsAssignableFrom は true を返しますが、2 番目の IsAssignableFrom は false を返します。 そしてまだ、最終的な代入はうまくコンパイルされます。

class class1 { }
class class2 : class1 { }
class generic1<T> { }
class generic2<T> : generic1<T> { }

class Program
{
    static void Main(string[] args)
    {
        Type c1 = typeof(class1);
        Type c2 = typeof(class2);
        Console.WriteLine("c1.IsAssignableFrom(c2): {0}", c1.IsAssignableFrom(c2));

        Type g1 = typeof(generic1<>);
        Type g2 = typeof(generic2<>);
        Console.WriteLine("g1.IsAssignableFrom(g2): {0}", g1.IsAssignableFrom(g2));

        generic1<class1> cc = new generic2<class1>();
    }
}

では、ある汎用型定義が他の汎用型から派生しているかどうかを実行時に判断するにはどうすればよいのでしょうか。

どのように解決するのですか?

からの 別の質問に対する回答 :

public static bool IsAssignableToGenericType(Type givenType, Type genericType)
{
    var interfaceTypes = givenType.GetInterfaces();

    foreach (var it in interfaceTypes)
    {
        if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
            return true;
    }

    if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
        return true;

    Type baseType = givenType.BaseType;
    if (baseType == null) return false;

    return IsAssignableToGenericType(baseType, genericType);
}

(私のコードではないので、もし答えが気に入ったらリンク先の答えにupvoteしてください。)