찾다

C# 학습 반영

Dec 20, 2016 pm 05:18 PM
c

1. 성찰이란 무엇인가:
성찰, 중국어 번역은 성찰이다.
이것은 .Net에서 런타임 유형 정보를 얻는 방법입니다. .Net 애플리케이션은 'Assembly', 'Module', 'Type'이라는 여러 부분으로 구성되며 Reflection은 프로그래머가 관련 정보를 얻을 수 있는 프로그래밍 방법을 제공합니다. 프로그램이 실행되는 동안 이러한 구성 요소에 대해 설명합니다.

리플렉션 개요

리플렉션의 정의: 메타데이터를 검사하고 이에 대한 유형 정보를 수집하는 기능입니다. 메타데이터(컴파일 후 가장 기본적인 데이터 단위)는 어셈블리나 모듈을 컴파일할 때 컴파일러에서 클래스 정의 테이블, 필드 정의 테이블, 메서드 정의 테이블 등을 생성하는 수많은 테이블입니다. System.reflection 네임스페이스에는 이러한 메타데이터 테이블의 코드를 반영(구문 분석)할 수 있는 여러 클래스가 포함되어 있습니다.


2. 리플렉션의 구체적인 용도:

(1) Assembly를 사용하여 어셈블리를 정의 및 로드하고 어셈블리 매니페스트에 나열된 모듈을 로드합니다. 이 어셈블리에서 유형을 입력하고 해당 유형의 인스턴스를 만듭니다.
(2) 모듈을 사용하여 모듈과 모듈에 포함된 클래스를 포함하는 어셈블리를 이해합니다. 또한 모듈에 정의된 모든 전역 메서드 또는 기타 특정 비전역 메서드를 얻을 수도 있습니다.
(3) ConstructorInfo를 사용하여 생성자의 이름, 매개변수, 액세스 한정자(예: pulic 또는 private) 및 구현 세부정보(예: 추상 또는 가상)를 알아보세요. 특정 생성자를 호출하려면 Type의 GetConstructors 또는 GetConstructor 메서드를 사용하세요.
(4) MethodInfo를 사용하여 메서드 이름, 반환 유형, 매개변수, 액세스 한정자(예: pulic 또는 private) 및 구현 세부정보(예: 추상 또는 가상) 등을 이해합니다. 특정 메서드를 호출하려면 Type의 GetMethods 또는 GetMethod 메서드를 사용하세요.
(5) FiedInfo를 사용하여 필드 이름, 액세스 한정자(예: 공개 또는 비공개) 및 구현 세부 정보(예: 정적) 등을 이해하고 필드 값을 가져오거나 설정합니다.
(6) EventInfo를 사용하여 이벤트 이름, 이벤트 핸들러 데이터 유형, 사용자 정의 속성, 선언 유형 및 반사 유형 등을 알아보고 이벤트 핸들러를 추가하거나 제거합니다.
(7) PropertyInfo를 사용하여 속성의 이름, 데이터 유형, 선언 유형, 반사 유형, 읽기 전용 또는 쓰기 가능 상태 등을 이해하고 속성 값을 가져오거나 설정합니다.
(8) ParameterInfo를 사용하여 매개변수의 이름, 데이터 유형, 입력 매개변수인지 출력 매개변수인지, 메소드 시그니처에서 매개변수의 위치 등을 이해합니다.


3. 리플렉션 관련 네임스페이스:


System.Reflection.Assembly

System.Reflection.MemberInfo
System.Reflection
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type


4. 반사의 계층적 모델:



참고: 레벨 간에는 일대다 관계가 있습니다.

반영의 역할:

1. 리플렉션을 사용하여 유형의 인스턴스를 동적으로 생성하거나, 기존 객체에 유형을 바인딩하거나, 기존 객체에서 유형을 가져올 수 있습니다
2. 애플리케이션은 리플렉션을 사용하여 특정 작업을 수행할 수 있도록 런타임에 특정 어셈블리에서 특정 유형을 로드해야 합니다.
3. 리플렉션은 주로 클래스 라이브러리와 함께 사용됩니다. 이러한 클래스 라이브러리는 더 많은 기능을 제공하기 위해 유형의 정의를 알아야 합니다.

적용포인트 :

1. 실제 애플리케이션에는 반사 유형을 사용해야 하는 애플리케이션이 거의 없습니다
2. 리플렉션 동적 바인딩을 사용하려면 성능이 저하되어야 합니다
3. 일부 메타데이터 정보는 리플렉션을 통해 얻을 수 없습니다
4. 특정 리플렉션 유형은 CLR용 컴파일러를 개발하는 사람들이 사용하도록 특별히 설계되었으므로 모든 리플렉션 유형이 모든 사람에게 적합한 것은 아닙니다.

6. 성찰의 실제 적용:

appDomain 어셈블리 반영

static void Main
{
// GetAssemblies를 통해 appDomain의 모든 어셈블리 호출
foreach(Appdomain.currentDomain.GetAssemblies()의 어셈블리 어셈블리)
{
//현재 어셈블리의 정보 반영
reflector.ReflectOnAssembly(assem)
}
}

참고: AppDomain 개체의 GetAssemblies 메서드를 호출하면 다음이 반환됩니다. a System.Reflection.Assembly 요소의 배열입니다.

단일 어셈블리 반영

system.reflecton.assemble 유형은 다음 세 가지 메서드를 제공합니다.

1. 로드 방법: 매우 권장되는 방법입니다. 로드 방법은 어셈블리 플래그를 가져와서 CLR이 전역 어셈블리 버퍼, 애플리케이션 기본 디렉터리 및 개인 경로에 정책을 적용하도록 합니다. 아래 어셈블리를 찾을 수 없으면 시스템에서 예외가 발생합니다.
2. LoadFrom 메서드: 어셈블리 파일의 경로 이름(확장자 포함)을 전달하면 CLR은 사용자가 지정한 어셈블리를 로드합니다. 전달된 매개 변수에는 버전 번호, 문화권 및 공개 키 정보가 포함될 수 없습니다. 지정된 경로에서 발견되면 예외가 발생합니다.
3. LoadWithPartialName: 애플리케이션이 로드되는 어셈블리 버전을 확인할 수 없으므로 이 메서드를 사용하지 마세요. 이 방법의 유일한 목적은 .Net 프레임워크의 테스트 단계에서 .Net 프레임워크가 제공하는 특정 동작을 사용하는 고객을 돕는 것이며, 이 방법은 결국 폐기될 것입니다.
참고: system.AppDomain은 Assembly의 정적 Load 메서드와 다른 Load 메서드도 제공합니다. AppDomain의 로드 메서드는 인스턴스 메서드이며 어셈블리에 대한 참조를 반환합니다. Assembly의 정적 Load 메서드 Fangfa는 어셈블리를 값으로 캡슐화하여 보냅니다. AppDomain의 로드 메서드를 사용하지 마세요.

유형 정보를 얻기 위해 리플렉션을 사용하세요.

유형 정보를 얻기 위해 리플렉션을 사용하는 간단한 예 :

시스템 사용;
sytem.reflection 사용;
클래스 반영
{
static void Main(string[]args)
{
reflecting Reflect=new Reflecting();// 새로운 자체 클래스 정의
//reflecting.exe 어셈블리 호출
어셈블리 myAssembly =assembly.loadfrom(“reflecting.exe”)
reflect.getreflectioninfo(myAssembly); // 리플렉션 정보 가져오기
}
// 리플렉션 콘텐츠를 가져오는 메서드 정의
void getreflectioninfo(assemble myassemble)
{
type[] typearr=myassemby.Gettypes();// 유형 가져오기
foreach(type typearr에 입력)//각 유형에 대한 세부 정보 가져오기
{
//유형의 구조 정보 가져오기
constructorinfo[] myconstructors=type.GetConstructors;
// 유형 필드 정보 가져오기
fieldinfo[] myfields=type.GetFiedls()
//메서드 정보 가져오기
MethodInfo myMethodInfo=type.GetMethods();
// 속성 정보 가져오기
propertyInfo[] myproperties=type. GetProperties
//이벤트 정보 가져오기
EventInfo[] Myevents=type.GetEvents;
}
}
}

기타 유형 개체를 가져오는 방법:

1. System.type 매개 변수는 문자열 유형이며 문자열은 해당 유형의 전체 이름(해당 네임스페이스 포함)을 지정해야 합니다
2. System.type은 GetNestedType, GetNestedTypes
3의 두 가지 인스턴스 메서드를 제공합니다. Syetem.Reflection.Assembly 유형에서 제공하는 인스턴스 메서드는 GetType, GetTypes, GetExporedTypes
4입니다. System.Reflection.Moudle은 다음과 같은 인스턴스 메서드를 제공합니다. GetType, GetTypes, FindTypes

반사 유형의 멤버 설정

반사 유형의 멤버는 반사 계층 구조에서 가장 낮은 데이터 계층입니다. 모델. 유형 개체의 GetMembers 메서드를 통해 유형의 멤버를 얻을 수 있습니다. 매개 변수 없이 GetMembers를 사용하는 경우 공개적으로 정의된 정적 변수와 해당 유형의 인스턴스 멤버만 반환합니다. 또한 매개 변수와 함께 GetMembers를 사용하여 매개 변수 설정을 통해 지정된 유형 멤버를 반환할 수도 있습니다. 특정 매개변수에 대해서는 msdn의 system.reflection.bindingflags 열거 유형에 대한 자세한 설명을 참조하세요.

예:

//반환할 유형의 멤버 콘텐츠 설정
bindingFlags bf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;
foreach( MemberInfo mi int t.getmembers(bf))
{
writeline(mi.membertype) //지정된 타입 멤버 출력
}

리플렉션을 통해 해당 타입의 인스턴스 생성

Pass Reflection은 어셈블리의 유형을 얻을 수 있으며, 얻은 어셈블리 유형을 기반으로 해당 유형의 새 인스턴스를 생성할 수 있습니다. 이는 앞서 언급한 런타임 바인딩을 구현하기 위해 런타임에 객체를 생성하는 기능이기도 합니다. 다음 방법을 통해 이를 달성할 수 있습니다.

1. System.Activator의 CreateInstance 메서드입니다. 이 메서드는 새 개체에 대한 참조를 반환합니다.
2. System.Activator의 createInstanceFrom은 이전 메서드와 비슷하지만 유형과 해당 어셈블리를 지정해야 합니다.
3. System.Appdomain 메서드: createInstance, CreateInstanceAndUnwrap, CreateInstranceFrom 및 CreateInstraceFromAndUnwrap
4. System.type의 InvokeMember 인스턴스 메서드: 이 메서드는 전달된 매개 변수와 일치하는 생성자를 반환하고 형식을 구성합니다.
5. System.reflection.constructinfo의 인스턴스 메소드 호출

리플렉션 유형 인터페이스

특정 유형으로 상속된 모든 인터페이스의 컬렉션을 가져오려면 FindInterfaces GetInterface 또는 GetInterfaces of Type을 호출하면 됩니다. 이러한 모든 메서드는 형식이 직접 상속하는 인터페이스만 반환할 수 있으며 인터페이스에서 상속되는 인터페이스는 반환하지 않습니다. 인터페이스의 기본 인터페이스를 반환하려면 위 메서드를 다시 호출해야 합니다.

리플렉션 성능

리플렉션 중에 CLR은 매개변수 확인, 권한 확인 등 더 많은 작업을 수행해야 하며 속도가 매우 느립니다. 프로그래밍 시 리플렉션을 사용하지 마세요. 동적으로 생성된 유형(후기 바인딩)을 작성하려는 애플리케이션의 경우 다음 방법을 대신 사용할 수 있습니다.

1. 클래스 상속을 통해. 유형이 컴파일 시간에 알려진 기본 유형에서 파생되도록 하고, 런타임에 유형의 인스턴스를 생성하고, 기본 유형의 변수에 해당 유형에 대한 참조를 넣은 다음 기본 유형의 가상 메서드를 호출합니다.
2. 인터페이스를 통해 구현됩니다. 런타임 시 해당 유형의 인스턴스를 생성하고 해당 인터페이스 유형의 변수에 해당 인스턴스에 대한 참조를 배치한 다음 인터페이스에서 정의된 가상 메서드를 호출합니다.
3. 위임을 통해 달성됩니다. 이름과 프로토타입이 컴파일 타임에 알려진 대리자와 일치하는 메서드를 형식에서 구현하도록 합니다. 먼저 런타임에 이 형식의 인스턴스를 생성한 다음 개체와 메서드 이름을 사용하여 대리자의 인스턴스를 생성한 다음 대리자를 통해 원하는 메서드를 호출합니다. 이 방법은 더 많은 작업이 필요하며 이전 두 가지 방법보다 효율성이 떨어집니다.

사용 참고 사항:

1. 크로스 어셈블리 리플렉션

개발 중에는 A.dll에서 리플렉션 B가 필요한 경우가 많습니다. dll의 유형에 주의를 기울이면 런타임 오류가 발생합니다. 크로스 어셈블리 리플렉션과 관련하여 다음 두 가지 사항을 기억하세요.
(1) typeof를 사용하고 컴파일이 통과할 수 있으면 크로스 어셈블리 리플렉션이 정상적으로 실행되어야 합니다. typeof는 강력한 타이핑을 지원한다고 할 수 있습니다. 예를 들어

Type supType = typeof(EnterpriseServerBase.DataAccess.IDBAccesser);

현재 어셈블리가 EnterpriseServerBase.dll에 대한 참조를 추가하지 않으면 컴파일 시 오류가 보고됩니다.

(2) Type.GetType을 사용하는 경우 Type.GetType이 강력한 형식이 아니기 때문에 상황이 더 복잡해집니다. Type.GetType의 매개 변수는 문자열입니다. string으로 표시되는 대상 유형이 현재 어셈블리에 없으면 Type.GetType은 런타임에 null을 반환합니다. 해결 방법은 대상 어셈블리를 먼저 로드한 다음 Assembly.GetType 메서드를 사용하는 것입니다. 예:

Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
Type supType = asmb.GetType("EnterpriseServerBase.DataAccess.IDBAccesser") ;

When Type.GetType을 사용하면 EnterpriseServerBase.dll에 대한 참조를 추가하더라도 Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")은 null을 반환합니다. 이는 Type.GetType이 현재 어셈블리에서만 형식 검색을 수행하기 때문입니다. .

2. 리플렉션 중 메서드의 반환 유형이 void인지 확인

Type serviceType = typeof(T);
MethodInfo methodInfo = serviceType.GetMethod(methodName);
판단 methodInfo.ReturnType == typeof(void)가 true입니다.


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
웹, 데스크탑 및 모바일 개발 용 C# .net웹, 데스크탑 및 모바일 개발 용 C# .netApr 25, 2025 am 12:01 AM

C# 및 .NET은 웹, 데스크탑 및 모바일 개발에 적합합니다. 1) 웹 개발에서 ASP.NETCORE는 크로스 플랫폼 개발을 지원합니다. 2) 데스크탑 개발은 WPF 및 Winforms를 사용하여 다양한 요구에 적합합니다. 3) 모바일 개발은 Xamarin을 통한 크로스 플랫폼 응용 프로그램을 실현합니다.

C# .NET Ecosystem : 프레임 워크, 라이브러리 및 도구C# .NET Ecosystem : 프레임 워크, 라이브러리 및 도구Apr 24, 2025 am 12:02 AM

C#.NET 생태계는 개발자가 응용 프로그램을 효율적으로 구축 할 수 있도록 풍부한 프레임 워크 및 라이브러리를 제공합니다. 1.asp.netCore는 고성능 웹 애플리케이션을 구축하는 데 사용되며 2.entityFrameworkCore는 데이터베이스 작업에 사용됩니다. 이러한 도구의 사용 및 모범 사례를 이해함으로써 개발자는 응용 프로그램의 품질과 성능을 향상시킬 수 있습니다.

C# .NET 애플리케이션 배포 Azure/AWS : 단계별 안내서C# .NET 애플리케이션 배포 Azure/AWS : 단계별 안내서Apr 23, 2025 am 12:06 AM

C# .NET 앱을 Azure 또는 AWS에 배포하는 방법은 무엇입니까? 답은 Azureappservice와 Awelasticbeanstalk를 사용하는 것입니다. 1. Azure에서 Azureappservice 및 AzurePipelines를 사용하여 배포를 자동화하십시오. 2. AWS에서 Amazon Elasticbeanstalk 및 Awslambda를 사용하여 배포 및 서버리스 컴퓨팅을 구현하십시오.

C# .net : 강력한 프로그래밍 언어 소개C# .net : 강력한 프로그래밍 언어 소개Apr 22, 2025 am 12:04 AM

C#과 .NET의 조합은 개발자에게 강력한 프로그래밍 환경을 제공합니다. 1) C#은 다형성 및 비동기 프로그래밍을 지원합니다. 2) .net은 크로스 플랫폼 기능과 동시 처리 메커니즘을 제공하여 데스크탑, 웹 및 모바일 애플리케이션 개발에 널리 사용됩니다.

.NET 프레임 워크 대 C#: 용어 디코딩.NET 프레임 워크 대 C#: 용어 디코딩Apr 21, 2025 am 12:05 AM

.NETFramework는 소프트웨어 프레임 워크이며 C#은 프로그래밍 언어입니다. 1..netframework는 데스크탑, 웹 및 모바일 애플리케이션 개발을 지원하는 라이브러리 및 서비스를 제공합니다. 2.C#은 .NETFramework 용으로 설계되었으며 최신 프로그래밍 기능을 지원합니다. 3..NetFramework는 CLR을 통해 코드 실행을 관리하고 C# 코드는 IL로 컴파일되어 CLR에 의해 실행됩니다. 4. .NETFramework를 사용하여 응용 프로그램을 신속하게 개발하면 C#은 LINQ와 같은 고급 기능을 제공합니다. 5. 일반적인 오류에는 유형 변환 및 비동기 프로그래밍 교착 상태가 포함됩니다. 디버깅을 위해서는 VisualStudio 도구가 필요합니다.

Demystifying C# .net : 초보자를위한 개요Demystifying C# .net : 초보자를위한 개요Apr 20, 2025 am 12:11 AM

C#은 Microsoft에서 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET은 Microsoft가 제공하는 개발 프레임 워크입니다. C#은 C의 성능과 Java의 단순성을 결합하며 다양한 응용 프로그램을 구축하는 데 적합합니다. .NET 프레임 워크는 여러 언어를 지원하고 쓰레기 수집 메커니즘을 제공하며 메모리 관리를 단순화합니다.

C# 및 .NET 런타임 : 함께 작동하는 방법C# 및 .NET 런타임 : 함께 작동하는 방법Apr 19, 2025 am 12:04 AM

C# 및 .NET 런타임은 개발자가 효율적이고 강력하며 크로스 플랫폼 개발 기능을 강화하기 위해 긴밀히 협력합니다. 1) C#은 .NET 프레임 워크와 완벽하게 통합하도록 설계된 유형 안전 및 객체 지향 프로그래밍 언어입니다. 2) .NET 런타임은 C# 코드 실행을 관리하고, 쓰레기 수집, 유형 안전 및 기타 서비스를 제공하며, 효율적이고 크로스 플랫폼 운영을 보장합니다.

C# .NET 개발 : 시작에 대한 초보자 안내서C# .NET 개발 : 시작에 대한 초보자 안내서Apr 18, 2025 am 12:17 AM

C# .NET 개발을 시작하려면 다음과 같은 것이 필요합니다. 1. C#의 기본 지식과 .NET 프레임 워크의 핵심 개념을 이해하십시오. 2. 변수, 데이터 유형, 제어 구조, 기능 및 클래스의 기본 개념을 마스터하십시오. 3. LINQ 및 비동기 프로그래밍과 같은 C#의 고급 기능을 배우십시오. 4. 일반적인 오류에 대한 디버깅 기술 및 성능 최적화 방법에 익숙해 지십시오. 이러한 단계를 통해 C#.NET의 세계를 점차적으로 침투하고 효율적인 응용 프로그램을 작성할 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구