먼저 C# 리플렉션의 개념을 이해하세요. 리플렉션은 런타임 유형을 발견하는 프로세스입니다. 리플렉션을 통해 특정 어셈블리에 포함된 모든 유형의 목록을 얻을 수 있습니다.
이 목록에는 해당 유형에 정의된 메서드, 필드, 속성 및 이벤트가 포함됩니다. 또한 특정 클래스, 메소드 매개변수 및 기본 클래스, 네임스페이스, 데이터 목록 등과 같은 기타 관련 정보
에서 지원하는 인터페이스 세트를 동적으로 검색할 수 있습니다.
C# 리플렉션 네임스페이스에 대한 자세한 소개:
1. System.Reflection 네임스페이스의 다양한 유형
(1) 어셈블리는 어셈블리
(2) AssemblyName을 사용하면 버전 정보, 지역 정보 등 어셈블리 ID에 숨겨진 많은 양의 정보를 찾을 수 있습니다.
(3) EventInfo 이벤트 정보
(4) FieldInfo 필드 정보
(5) MethodInfo 메소드 정보
(6) ParameterInfo 매개변수 정보
( 7) PropertyInfo 속성 정보
(8) MemberInfo는 EventInfo, FieldInfo, MethodInfo, PropertyInfo 및 기타 유형에 대한 공개 동작을 정의하는 추상 기본 클래스입니다.
(9) 모듈은 다중 파일 어셈블리를 사용하여 특정 모듈에 액세스하는 데 사용됩니다.
2. System.Type 클래스
System.Type에서 지원하는 멤버 다음과 같은 카테고리로 나눌 수 있습니다.
(1) Is***는 IsAbstract, IsClass, IsValueType 등과 같은 메타데이터 유형을 확인하는 데 사용됩니다.
(2) Get** * 해당 유형의 지정된 이벤트(EventInfo)를 가져오기 위한 GetEvent()와 같이 유형에서 지정된 항목을 가져오는 데 사용됩니다.
또한 이러한 메소드에는 단수형과 복수형이 있습니다. 예를 들어, GetEvent()는 복수형 GetEvents()에 해당합니다.
이 메서드는 관련 EventInfo 배열을 반환합니다.
(3) FindMembers()는 쿼리 조건을 기반으로 MemberInfo 유형의 배열을 반환합니다.
(4)GetType() 이 정적 메서드는 문자열 이름을 기반으로 Type 인스턴스를 반환합니다.
p >(5)InvokeMember()는 주어진 항목에 대해 지연 바인딩을 수행합니다
3. Type 인스턴스를 얻는 세 가지 방법
Type은 추상 클래스이므로, Type 객체를 생성하기 위해 new 키워드를 직접 사용할 수 없습니다.
(1) System.Object.GetType() 사용
Person pe=new Person() //--- - -----pe를 person 클래스의 객체로 정의합니다.
Type t=pe.GetType()
(2) System.Type.GetType()을 사용합니다. 정적 메소드, 매개변수는 유형의 정규화된 이름입니다.
Type t=Type.GetType("Entity.Person") 이 메소드는 오버로드되어 두 개의 부울 유형 매개변수를 지정할 수 있습니다. 현재 유형이 발견될 때 예외를 던질 수 있는지 여부를 제어합니다.
다른 유형은 문자열이 대소문자를 구분하는지 여부를 나타내는 데 사용됩니다.
Type t=Type.GetType(" Entity.Person",false,true); 들어오는 문자열에는 해당 유형이 위치한 어셈블리 정보가 포함되어 있지 않습니다. 이때 해당 유형은 현재 실행 중인 어셈블리에 정의된 것으로 간주됩니다.
외부 전용 어셈블리에 대한 유형 메타데이터를 얻으려면 문자열 매개 변수는 해당 유형의 정규화된 이름과 해당 유형이 있는 어셈블리의 친숙한 이름을 사용해야 합니다.
t를 입력하세요. =Type.GetType("Entity.Person","Entity"); //------"Entity"는 유형이 있는 어셈블리의 이름입니다. 수신 문자열은 +를 지정할 수 있습니다. 중첩 유형을 나타내기 위해 표시합니다.
person 클래스에 중첩된 열거 유형 City의 유형 정보를 얻으려면 다음을 수행할 수 있습니다.
t=Type.GetType을 입력하세요. ("Entity.person+City");
(3) typeof 연산자 사용
Type t=typeof(person); p>One 방법을 사용하려면 먼저 인스턴스를 만들어야 하지만, 후자의 두 가지 방법은 먼저 인스턴스를 만들 필요가 없습니다. 그러나 typeof 연산자를 사용하려면 여전히 해당 유형의 컴파일 시간 정보를 알아야 하지만
System.Type.GetType() 정적 메서드를 사용하면 해당 유형의 컴파일 시간 정보를 알 필요가 없습니다. 그래서 선호되는 방법입니다.
가장 간단한 C# 리플렉션 예제는 먼저 다음과 같이 클래스 라이브러리를 작성합니다:
namespace ReflectionTest
{
public class WriteTest
p>
p>
{
//매개변수가 있는 공개 메소드
public void WriteString(string s, int i)
{ < /p>
p>
Console.WriteLine("WriteString:" + s + i.ToString())
}
//1개의 정적 메서드 매개변수
public static void StaticWriteString(string s)
{
Console.WriteLine("StaticWriteString:" + s); }
//매개변수가 없는 정적 메서드
public static void NoneParaWriteString()
{
Console.WriteLine("NoParaWriteString") ;
p>}
}
}
TestApp 클래스
{
public static void Main ()
{
어셈블리 엉덩이
객체 obj; p> //정적 메서드 테스트에 사용
Object any = new Object();
//지정된 클래스 라이브러리 파일은 상대 경로가 아닌 절대 경로를 사용해야 합니다.
p>
ass = Assembly.LoadFile(@"D:\Source Code\00.C#Sudy\01.Reflection\01\ReflectTest.dll")
//네임스페이스 및 클래스 이름은 함께 지정해야 합니다.
p>type = ass.GetType("ReflectionTest.WriteTest")
/**//*example1--------- */
MethodInfo 메소드 = type.GetMethod("WriteString");
string test = "test"
int i = 1; >
Object[] parametors = new Object[]{test,i};
//예제 1에서는 사용할 메소드가 static이 아니기 때문에 반영할 클래스를 인스턴스화해야 합니다. 방법.
//객체 인스턴스 생성
obj = ass.CreateInstance("ReflectionTest.WriteTest")
//매개변수가 있는 public *** 메서드 실행 < /p>
method.Invoke(obj, parametors);
//method.Invoke(any, parametors);//예외: 반영할 클래스를 인스턴스화해야 합니다. 메소드는 정적 메소드가 아닙니다.
/**//*example2----------*/
method = type.GetMethod("StaticWriteString")
method.Invoke(null, new string[] { "test"}); //첫 번째 매개변수는 무시됩니다.
//첫 번째 매개변수는 무시됩니다. 즉, 아무것도 호출되지 않습니다.
//물론 임의대로 새 객체를 생성하더라도 이런 방식은 권장되지 않습니다.
//그러나 예제 1에 해당하면 Invoke 시 일관성 없는 유형의 인스턴스를 매개변수로 사용하면 런타임 오류가 발생합니다.
method.Invoke(obj, new string[] { "test"});
method.Invoke(any, new string[] { "test"});
method.Invoke(any, new string[] { "test"});
p> p>
/**//*example3------------*/
method = type.GetMethod("NoneParaWriteString") //정적 호출 매개변수 없는 메소드 예를 들어 지금은 매개변수를 지정할 필요가 없으며 null만 사용하면 됩니다. s
method.Invoke(null, null);
}
}
위 요약에서 볼 수 있듯이 외부에서 호출되는 동적 라이브러리에 리플렉션을 적용하는 경우 Assembly.LoadFile()을 사용해야 하며 그 후 유형, 실행 방법 등을 얻어야 합니다.
리플렉션을 사용하여 현재 어셈블리에 개체 인스턴스를 생성하는 경우 또는 특정 클래스를 실행합니다. 정적 메서드의 경우 Type.GetType("클래스의 전체 이름")을 사용하세요.