Aracılığıyla paylaş


Yansıma (LINQ) ile bir derlemenin meta verilerini sorgulama

.NET yansıma API'lerini kullanarak bir .NET derlemesindeki meta verileri inceler ve bu derlemede bulunan tür, tür üyesi ve parametre koleksiyonları oluşturursunuz. Bu koleksiyonlar genel IEnumerable<T> arabirimini desteklediğinden LINQ kullanılarak sorgulanabilir.

Aşağıdaki örnekte LINQ'in belirtilen arama ölçütüyle eşleşen yöntemlerle ilgili belirli meta verileri almak için yansımayla nasıl kullanılabileceğini gösterir. Bu durumda sorgu, diziler gibi numaralandırılabilir türler döndüren derlemedeki tüm yöntemlerin adlarını bulur.

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

Örnek, belirtilen derlemede bir tür dizisi döndürmek için Assembly.GetTypes yöntemini kullanır. Yalnızca ortak türlerin döndürülmesi amacıyla filtresinin uygulandığı yer. Her ortak tür için, Type.GetMethods çağrısından döndürülen MethodInfo dizisi kullanılarak bir alt sorgu oluşturulur. Bu sonuçlar yalnızca dönüş türü bir dizi veya IEnumerable<T>uygulayan bir tür olan yöntemleri döndürecek şekilde filtrelenir. Son olarak, bu sonuçlar tür adı anahtar olarak kullanılarak gruplandırılır.