Sdílet prostřednictvím


Postupy: Vytvoření dotazu na metadata sestavení s reflexí (LINQ)

Následující příklad ukazuje jak LINQ s odraz lze načíst metadata specifické metody, které odpovídají zadanému vyhledávacímu kritériu.V tomto případě dotaz vyhledá názvy všech metod v sestavení, která vrátí agregující typy jako matice.

Příklad

Imports System.Reflection
Imports System.IO
Imports System.Linq
Module Module1

    Sub Main()
        Dim asmbly As Assembly = 
            Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089")

        Dim pubTypesQuery = From type In asmbly.GetTypes() 
                            Where type.IsPublic 
                            From method In type.GetMethods() 
                            Where method.ReturnType.IsArray = True  
                            Let name = method.ToString() 
                            Let typeName = type.ToString() 
                            Group name By typeName Into methodNames = Group


        Console.WriteLine("Getting ready to iterate")
        For Each item In pubTypesQuery
            Console.WriteLine(item.methodNames)

            For Each type In item.methodNames
                Console.WriteLine(" " & type)
            Next 
        Next
        Console.ReadKey()
    End Sub 

End Module
using System.Reflection;
using System.IO;
namespace LINQReflection
{
    class ReflectionHowTO
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089");
            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);
                }
            }

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }  
}

V příkladu GetTypes metoda vrátí pole typů v zadaném sestavení.Kde filtr tak, aby byly vráceny pouze veřejné typy.Pro každý typ veřejné poddotazu je generován pomocí MethodInfo matice, která je vrácena z GetMethods volání.Tyto výsledky jsou filtrovány pouze metody, jejichž návratový typ je matice nebo jinak typ, který implementuje vrátit IEnumerable.Tyto výsledky nakonec seskupeny pomocí názvu typu jako klíč.

Probíhá kompilace kódu

  • Vytvoření Visual Studio projektu, který se zaměřuje.NET Framework verze 3.5.Projekt obsahuje odkaz na System.Core.dll a using směrnice (C#) nebo Imports prohlášení (Visual Basic) pro výchozí obor názvů System.Linq.V jazyce C# projekty, přidejte using směrnice pro obor názvů System.IO.

  • Zkopírujte tento kód do projektu.

  • Stisknutím klávesy F5 sestavit a spustit program.

  • Stisknutím libovolné klávesy uzavřete okno konzoly.

Viz také

Koncepty

LINQ na objekty