リフレクションを使用してアセンブリのメタデータを照会する方法 (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: {0}", groupOfMethods.Key);
    foreach (var method in groupOfMethods)
    {
        Console.WriteLine("  {0}", method);
    }
}

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