방법: 리플렉션을 사용하여 어셈블리의 메타데이터 쿼리(LINQ)
다음 예제에서는 LINQ를 리플렉션과 함께 사용하여 지정한 검색 조건에 일치하는 메서드에 대한 특정 메타데이터를 검색할 수 있는 방법을 보여 줍니다. 이 경우 쿼리에서는 배열과 같은 열거 가능한 형식을 반환하는 어셈블리의 모든 메서드에 대한 이름을 찾습니다.
예제
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();
}
}
}
예제에서는 GetTypes 메서드를 사용하여 지정한 어셈블리에서 형식의 배열을 반환합니다. 공용 형식만 반환되도록 where 필터가 적용됩니다. 각 공용 형식에 대해 GetMethods 호출에서 반환된 MethodInfo 배열을 사용하여 하위 쿼리가 생성됩니다. 반환 형식이 배열이거나 IEnumerable<T>을 구현하는 형식인 메서드만 반환하도록 이러한 결과가 필터링됩니다. 마지막으로 이러한 결과는 형식 이름을 키로 사용하여 그룹화됩니다.
코드 컴파일
.NET Framework 버전 3.5를 대상으로 하는 Visual Studio 프로젝트를 만듭니다. 기본적으로 프로젝트에는 System.Core.dll에 대한 참조 및 System.Linq 네임스페이스에 대한 using 지시문(C#) 또는 Imports 문(Visual Basic)이 있습니다. C# 프로젝트에서는 System.IO 네임스페이스에 대한 using 지시문을 추가합니다.
프로젝트에 이 코드를 복사합니다.
F5 키를 눌러 프로그램을 컴파일하고 실행합니다.
아무 키나 눌러 콘솔 창을 닫습니다.