Bagikan melalui


Cara mengkueri metadata assembly dengan Reflection (LINQ)

Anda menggunakan API refleksi .NET untuk memeriksa metadata dalam rakitan .NET dan membuat kumpulan jenis, jenis anggota, dan parameter yang ada di rakitan tersebut. Karena koleksi ini mendukung antarmuka IEnumerable<T> generik, koleksi tersebut dapat dikueri dengan menggunakan LINQ.

Contoh berikut menunjukkan bagaimana LINQ dapat digunakan dengan refleksi untuk mengambil metadata tertentu tentang metode yang cocok dengan kriteria pencarian tertentu. Dalam hal ini, kueri menemukan nama semua metode dalam rakitan yang mengembalikan jenis yang dapat dijumlahkan seperti array.

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}");
    }
}

Contoh menggunakan metode Assembly.GetTypes untuk mengembalikan array jenis dalam rakitan yang ditentukan. di mana filter diterapkan sehingga hanya jenis publik yang dikembalikan. Untuk setiap tipe publik, subkueri dihasilkan dengan menggunakan array MethodInfo yang dikembalikan dari panggilan Type.GetMethods. Hasil ini difilter untuk mengembalikan hanya metode yang jenis pengembaliannya adalah array atau jenis lain yang mengimplementasikan IEnumerable<T>. Akhirnya, hasil ini dikelompokkan dengan menggunakan nama jenis sebagai kunci.