C#의 리플렉션

PHPz
PHPz원래의
2024-09-03 15:19:12940검색

C#의 리플렉션은 기능에 대한 정보를 수집하고 자체적으로 작동하는 프로세스입니다. 수집 정보에는 개체의 속성, 유형, 이벤트 및 메서드가 포함됩니다. 리플렉션은 모든 유형의 어셈블리를 찾는 데 유용합니다. 동적으로 이는 기존 객체에 동적으로 유형을 바인딩하거나 가져올 수 있는 어셈블리 메서드를 호출합니다. 리플렉션은 유형의 인스턴스를 만드는 데 사용됩니다. 런타임 중에 어셈블리를 검색하기 위해 메타데이터를 읽는 데 사용되는 리플렉션의 주요 목적인 해당 속성과 필드에 액세스할 수 있습니다.

C#에서 Reflection이 필요한 이유는 무엇인가요?

런타임 중에 유형 정보를 얻으려면 C#에서 리플렉션이 필요합니다. 런타임 중에 모듈과 어셈블리를 찾기 위해 메타데이터를 읽기 위해 관리 코드를 관찰하는 프로세스입니다. 리플렉션은 동작을 수정하는 데 사용되는 어셈블리에서 메타데이터를 추출하여 프로그램에 반영합니다.  시스템. 리플렉션 네임스페이스를 사용하면 메서드, 로드된 유형 및 필드의 관리되는 뷰에 액세스하여 동적으로 생성하고 유형을 호출할 수 있습니다. 다음 신청 절차에 대한 숙고가 필요합니다.

  • 런타임 프로세스 중에 리플렉션을 통해 속성 정보를 볼 수 있습니다.
  • 리플렉션을 통해 속성과 메서드에 대한 지연 바인딩이 가능합니다
  • 여러 유형의 어셈블리와 해당 유형을 검사합니다
  • 런타임 중에 새로운 유형을 생성할 수 있으며 해당 유형에 따라 다양한 작업을 수행합니다.

C#에서 Reflection은 어떻게 작동하나요?

C# Reflection을 사용하면 애플리케이션이 스스로 정보를 얻을 수 있을 뿐만 아니라 스스로 작동할 수도 있습니다. 모든 유형의 어셈블리를 효과적으로 검색하고 어셈블리 메서드를 동적으로 호출합니다.

Reflection에 사용되는 주요 중요 클래스는 System입니다. Type 클래스는 CTS(Common Type System)라는 유형을 나타내는 추상 클래스입니다. 이 클래스를 사용하면 네임스페이스 모듈에서 사용한 유형을 찾고 해당 유형이 값 또는 참조 유형인지 확인할 수 있습니다. 다음 항목을 사용하여 메타데이터 테이블을 구문 분석할 수 있습니다.

  • 방법
  • 속성
  • 이벤트
  • 필드

리플렉션을 사용하여 후기 바인딩이 달성됩니다. 컴파일 시간에는 이러한 이유로 어떤 어셈블리를 로드해야 할지 알 수 없습니다. 런타임 실행 시 사용자에게 어셈블리 이름과 유형을 입력하도록 요청하여 적절한 어셈블리를 로드합니다. 어셈블리에 대한 직접 로딩에 접근함으로써 우리는 System을 사용합니다. 반사. 세 가지 정적 유형을 얻어서 조립하는 것은

  • 로드에서
  • 로드모듈
  • 부분 이름으로 로드

어셈블리가 exe 또는 dll 파일이라는 점을 고려하면 해당 파일은 .dll 또는 .exe 확장자를 갖는 Common Type System용 이식 가능한 실행 파일로 만들어집니다. 이식 가능한 실행 파일은 다음과 같은 여러 테이블을 포함하는 메타데이터입니다.

  • 메서드 정의표
  • 유형 정의 테이블
  • 필드 정의 테이블

C#의 리플렉션 예

다음은 C#의 Reflection 예입니다.

예시 #1

using System;
using System.Reflection;
namespace Reflection_Sample {
class Program_1 {
// Main Method
static void Main(string[] args)
{
// to initialize _type as typeof string
Type _type = typeof(string);
// by using the Reflection to find and in any sort of data related to _type
Console.WriteLine("Name : {0}", _type.Name);
Console.WriteLine("Full Name : {0}", _type.FullName);
Console.WriteLine("Namespace : {0}", _type.Namespace);
Console.WriteLine("Base Type : {0}", _type.BaseType);
}
}
}

위 코드에서는 typeof 메소드를 사용하여 _type 유형을 문자열로 로드했습니다. 그런 다음 _type에 대한 리플렉션을 연결하여 네임스페이스, 이름, 전체 이름 및 기본 유형을 포함한 문자열 클래스에 대한 정보를 얻습니다.

출력:

C#의 리플렉션

예시 #2

이 프로그램에서는 typeof 메소드를 정의하여 어셈블리를 얻고 _type이라는 방식으로 처리합니다. 집회. 예제 프로그램을 살펴보겠습니다

using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type _type = typeof(System.String);
Console.WriteLine(_type.Assembly);
}
}

출력:

C#의 리플렉션

예시 #3

이 프로그램에서는 리플렉션을 사용하여 메타데이터를 표시합니다. 여기에는 메소드, 클래스 및 다양한 매개변수화된 생성자가 포함됩니다. 아래 예를 살펴보겠습니다.

using System;
using System.Reflection;
namespace Sample_ReflectionMetadata
{
// to define a class StudentDetails
class StudentDetails
{
// defining the Properties
public int _RollNo
{
get;
set;
}
public string _Name
{
get;
set;
}
// Constructor with no arguments
public StudentDetails()
{
_RollNo = 0;
_Name = string.Empty;
}
// this is a Parameterised Constructor with 2 parameters
public StudentDetails(int _Srollno, string _Sname)
{
_RollNo = _Srollno;
_Name = _Sname;
}
// to invoke method to Display Student Details
public void StudentDisplayData()
{
Console.WriteLine("Roll Number : {0}", _RollNo);
Console.WriteLine("Name : {0}", _Name);
}
}
class ReflectionClass
{
// Main Method
static void Main(string[] args)
{
// to declare Assembly and loading the current assembly
Assembly _executing = Assembly.GetExecutingAssembly();
Type[] _types = _executing.GetTypes();
foreach(var item in _types)
{
Console.WriteLine("Class : {0}", item.Name);
// storing the methods  in array
MethodInfo[] methods = item.GetMethods();
foreach(var method in methods)
{
// for displaying each method
Console.WriteLine("--> Method : {0}", method.Name);
// to store the parameters in array
ParameterInfo[] parameters = method.GetParameters();
foreach(var arg in parameters)
{
Console.WriteLine(" Parameter : {0} Type : {1}",
arg.Name, arg.ParameterType);
}
}
}
}
}
}

출력:

C#의 리플렉션

예시 #4

성찰은 실제 구조와 행동을 동적으로 관찰하고 변경하는 과정입니다. 아래 샘플 프로그램에서 Reflection은 런타임 중에 애플리케이션의 정보를 분석하고 변경할 수 있도록 작동합니다.  예시를 보시죠

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ReflectionSample
{
class Program
{
private static int value_1= 15, value_2 = 25, value_3 = 30;
static void Main(string[] args)
{
Console.WriteLine("The Values are = " + (value_1 + value_2 + value_3));
Console.WriteLine("Input the Name of variable to be altered:");
string _varName = Console.ReadLine();
Type _type = typeof(Program);
FieldInfo _fieldInfo = _type.GetField(_varName, BindingFlags.NonPublic | BindingFlags.Static);
if(_fieldInfo != null)
{
Console.WriteLine("The Latest Value of " + _fieldInfo.Name + " is " + _fieldInfo.GetValue(null) + ". Input NeW Value:");
string newValue = Console.ReadLine();
int newInt;
if(int.TryParse(newValue, out newInt))
{
_fieldInfo.SetValue(null, newInt);
Console.WriteLine(" Final Values are = " + (value_1 + value_2 + value_3));
}
Console.ReadKey();
}
}
}
}

여기서 이름을 알면 런타임 중에 변수 값을 변경할 수 있습니다. 리플렉션을 사용하면 이러한 유형의 메서드를 구현할 수 있습니다. 아래 출력을 다음과 같이 살펴보겠습니다.

출력:

C#의 리플렉션

결론

이 기사가 즐거웠기를 바랍니다. C# Reflection은 여기에서 .Net의 중요한 기능을 다룹니다. 우리는 몇 가지 예를 통해 C#.Net에서 Reflection이 어떻게 작동하는지 배웠습니다. 이 글이 여러분의 올바른 이해에 도움이 되기를 바랍니다.

위 내용은 C#의 리플렉션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C# 매개변수다음 기사:C# 매개변수