如何使用反映查詢組件的中繼資料 (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> 之類型的方法。 最後,會使用類型名稱作為索引鍵來群組這些結果。