최고의 C #을 반사 (반사) 튜토리얼 2024년, 이 튜토리얼에서는 반사 (반사) 사용,보기 메타 데이터,예,를 배울 수 있습니다.
반사 수단은 상기 프로그램을 검출하고 자신의 상태 또는 동작을 변경하는 기능을 액세스 할 수있다.
총회는 결국 구성원이 포함 유형을 포함하는 모듈을 포함하고 있습니다. 반사 개체 패키지 어셈블리, 모듈 및 유형을 제공합니다.
당신은 유형이 기존 개체에 바인딩, 동적 형식의 인스턴스를 만들 반사를 사용하거나 기존 개체에서 유형을 얻을 수 있습니다. 그런 접근 방식의 유형을 전화 또는 필드와 속성에 액세스 할 수 있습니다.
장점 :
단점 :
다음과 같은 목적을 위해 반사 (반사) :
우리는 이미 위의 섹션에서 (속성) 정보의 속성을 볼 수 있습니다 반사 (반사)의 사용을 언급했다.
목적하는 System.Reflection MemberInfo가 클래스는클래스 (속성)과 관련된 특성을 발견하기 위해 초기화 될 필요가있다. 다음과 같이이 작업을 수행하려면, 대상 객체 클래스를 정의 할 수 있습니다 :
System.Reflection.MemberInfo 정보 = 대한 typeof (MyClass에);
다음 프로그램은이 점을 보여줍니다
시스템을 이용하여; [AttributeUsage (AttributeTargets.All)] 공용 클래스 HelpAttribute : System.Attribute { 공공 읽기 전용 문자열 URL; 공공 문자열 주제 // 주제 명명 (명명) 매개 변수 {이다 취득 { 항목을 반환; } 세트 { 주제 = 값; } } 공공 HelpAttribute (문자열 URL이) // URL로 포지셔닝 (위치) 매개 변수 {이다 this.Url = URL; } 개인 문자열 주제; } [HelpAttribute ( "MyClass 클래스에 대한 정보")] 클래스 MyClass에 { } 네임 스페이스 AttributeAppl { 클래스 프로그램 { 정적 무효 메인 (문자열 []에 인수) { System.Reflection.MemberInfo 정보 = 대한 typeof (MyClass에); [] 속성의 =의 info.GetCustomAttributes (사실) 개체; 대한 (INT 나는 = 0; 나는 <attributes.Length; 내가 ++) { System.Console.WriteLine 속성 ([I]); } Console.ReadKey (); } } }
위의 코드를 컴파일하고 실행되면, 그것은MyClass클래스에 부착 된 사용자 지정 속성을 표시합니다 :
HelpAttribute
이 예에서, 우리는 마지막 장에서 만든DeBugInfo 속성을사용하며,Rectangle클래스의 메타 데이터를 읽을 반사 (반사)를 사용합니다.
시스템을 이용하여; 하는 System.Reflection을 사용함; 네임 스페이스 BugFixApplication { // 버그 수정 사용자 정의 속성은 클래스에 할당 및 회원 [AttributeUsage (AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = TRUE)] 공용 클래스 DeBugInfo : System.Attribute { 개인 INT bugNo; 개인 문자열 개발자; 개인 문자열 lastReview; 공공 문자열 메시지; 공공 DeBugInfo (INT의 BG, 문자열 dev에, 문자열 D) { this.bugNo = BG; this.developer = dev에; this.lastReview = D; } 공공 INT BugNo { 취득 { bugNo를 반환; } } 공공 문자열 개발자 { 취득 { 개발자를 반환; } } 공공 문자열 LastReview { 취득 { lastReview를 반환; } } 공공 문자열 메시지 { 취득 { 메시지를 반환; } 세트 { 메시지 = 값; } } } [DeBugInfo (45 "자라 알리", "2012년 12월 8일" 메시지 = "반환 형식이 일치하지")] [DeBugInfo (49 "Nuha 알리", "2012년 10월 10일" 메시지 = "사용하지 않는 변수")] 클래스 직사각형 { // 멤버 변수는 두 배 길이를 보호; 이중 폭을 보호; 공공 직사각형 (더블 리터, 더블 w) { 길이 = 1; 폭 = w; } [DeBugInfo (55, "자라 알리", "19/10/2012" 메시지 = "반환 형식이 일치하지")] 공공 이중의 getArea () { 길이 * 너비를 반환; } [DeBugInfo (56, "자라 알리", "19/10/2012")] 공공 무효 표시 () { Console.WriteLine ( "길이 : {0}", 길이); Console.WriteLine ( "폭 : {0}", 폭); Console.WriteLine ( "지역 : {0}"의 getArea ()); } } // 끝 클래스의 직사각형 클래스 ExecuteRectangle { 정적 무효 메인 (문자열 []에 인수) { 사각형 R = 새로운 Rectangle (4.5, 7.5); r.Display (); 입력 유형 = 대한 typeof (직사각형); Rectangle 클래스를 트래버스 //은 (Object가 type.GetCustomAttributes 속성 (false)를) foreach는 속성 { DeBugInfo DBI = (DeBugInfo)의 속성; (널 (null)! = DBI)의 경우 { Console.WriteLine ( "버그 번호 : {0}", dbi.BugNo); 없음 Console.WriteLine ( "개발자 : {0}", dbi.Developer); Console.WriteLine ( "마지막 검토 : {0}", dbi.LastReview); Console.WriteLine ( "비고 : {0}", dbi.Message); } } // 반복 처리 방법은 () (type.GetMethods에 MethodInfo 분) foreach는 속성 { foreach는 (m.GetCustomAttributes의 속성 (참)) { DeBugInfo DBI = (DeBugInfo)는; (널 (null)! = DBI)의 경우 { Console.WriteLine ( "버그 번호 : {0} 방법에 대한 {1}",하지 dbi.BugNo, m.Name); Console.WriteLine ( "개발자 : {0}", dbi.Developer); Console.WriteLine ( "마지막 검토 : {0}", dbi.LastReview); Console.WriteLine ( "비고 : {0}", dbi.Message); } } } Console.ReadLine (); } } }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
길이 : 4.5 폭 : 7.5 지역 : 37,125 버그 번호 : 49 개발자 : Nuha 알리 마지막 검토 : 2012년 10월 10일 비고 : 사용하지 않는 변수 버그 번호 : 45 개발자 : 자라 알리 마지막 검토 : 2012년 12월 8일 비고 : 반환 형식이 일치 버그 번호 : 55, 방법에 대한 :의 getArea 개발자 : 자라 알리 마지막 검토 : 19/10/2012 비고 : 반환 형식이 일치 버그 번호 : (56), 방법 : 디스플레이 개발자 : 자라 알리 마지막 검토 : 19/10/2012 비고 :