次の方法で共有


リフレクションを使用してアセンブリのメタデータにクエリを実行する方法 (LINQ)

.NET リフレクション API を使用して、.NET アセンブリ内のメタデータを調べ、そのアセンブリ内にある型、型メンバー、およびパラメーターのコレクションを作成します。 これらのコレクションはジェネリック IEnumerable<T> インターフェイスをサポートしているため、LINQ を使用してクエリを実行できます。

次の例は、LINQ をリフレクションと共に使用して、指定した検索条件に一致するメソッドに関する特定のメタデータを取得する方法を示しています。 この場合、クエリは、配列などの列挙可能な型を返すアセンブリ内のすべてのメソッドの名前を検索します。

Assembly assembly = Assembly.Load("System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e");
var pubTypesQuery = from type in assembly.GetTypes()
                    where type.IsPublic
                    from method in type.GetMethods()
                    where method.ReturnType.IsArray == true
                        || (method.ReturnType.GetInterface(
                            typeof(System.Collections.Generic.IEnumerable<>).FullName!) != null
                        && method.ReturnType.FullName != "System.String")
                    group method.ToString() by type.ToString();

foreach (var groupOfMethods in pubTypesQuery)
{
    Console.WriteLine($"Type: {groupOfMethods.Key}");
    foreach (var method in groupOfMethods)
    {
        Console.WriteLine($"  {method}");
    }
}

この例では、Assembly.GetTypes メソッドを使用して、指定したアセンブリ内の型の配列を返します。 パブリック型のみが返されるように、where フィルターが適用されています。 パブリック型ごとに、Type.GetMethods 呼び出しから返される MethodInfo 配列を使用してサブクエリが生成されます。 これらの結果は、戻り値の型が配列であるか、IEnumerable<T>を実装する型であるメソッドのみを返すようにフィルター処理されます。 最後に、これらの結果は、型名をキーとして使用してグループ化されます。