programing

.NET에서 리플렉션을 사용하는 것이 권장되는 이유는 무엇입니까?

nasanasas 2020. 12. 29. 07:11
반응형

.NET에서 리플렉션을 사용하는 것이 권장되는 이유는 무엇입니까?


그것을 사용하는 것이 확실히 좋은 습관입니까?

반성을 필요로하는 프로젝트에서 가능한 상황은 무엇입니까?


Reflection의 주요 가치는 어셈블리, 형식 및 멤버를 검사하는 데 사용할 수 있다는 것입니다. 알 수없는 어셈블리 또는 개체의 내용을 확인하는 매우 강력한 도구이며 다양한 경우에 사용할 수 있습니다.

리플렉션의 반대자들은 정적 코드 실행과 비교할 때 느리지 만 리플렉션은 .NET 프레임 워크 전체에서 사용되며 남용되지 않는 한 툴킷에서 매우 강력한 도구가 될 수 있다고 언급합니다.

유용한 응용 프로그램 :

  • 어셈블리의 종속성 확인

  • 인터페이스를 준수하고 기본 / 추상 클래스에서 파생되며 속성으로 멤버를 검색하는 위치 유형

  • (냄새) 테스트-테스트 할 수없는 클래스에 의존하는 경우 (즉, 쉽게 가짜를 만들 수없는 경우) Reflection을 사용하여 클래스 내에 가짜 값을 삽입 할 수 있습니다. 예쁘지 않고 권장하지도 않지만 바인딩에서 편리한 도구가 될 수 있습니다.

  • 디버깅-로드 된 어셈블리 목록, 해당 참조, 현재 메서드 등을 덤프합니다.


반사에는 많은 용도가 있습니다.

  1. 객체의 속성을 반복합니다.
  2. 런타임에 정의 된 메서드를 호출합니다.
  3. 같은 맥락에서 다른 많은 사람들.

그러나 리플렉션을 가장 좋아하는 용도 중 하나는 속성으로 표시된 속성을 찾는 것입니다.

예를 들어, Lucene을 사용하여 내 클래스의 어떤 속성을 인덱싱해야 하는지를 표시하는 속성을 작성했습니다. 런타임에 모든 클래스를보고 "표시된"속성에 대해 클래스를 쿼리하여 인덱싱해야하는 필드를 파악할 수 있습니다.


리플렉션은 런타임 동안 개체를 조사하는 방법 일뿐입니다. 그렇게 할 필요가 없다면 사용하지 말아야합니다.


Reflection 은 응용 프로그램이 자신에 대한 정보를 수집하고 자체적으로 조작 할 수 있도록합니다. 어셈블리에서 모든 형식을 찾거나 어셈블리에서 메서드를 동적으로 호출하는 데 사용할 수 있습니다.

System.Reflection : 네임 스페이스에는 동적으로 형식을 만들고 호출하는 기능과 함께로드 된 형식, 메서드 및 필드의 관리보기를 제공하는 클래스와 인터페이스가 포함됩니다. 이 프로세스를 .NET 프레임 워크에서 Reflection이라고합니다.

System.Type : class는 .NET Reflection 기능의 기본 클래스이며 메타 데이터에 액세스하는 기본 방법입니다. System.Type 클래스는 추상 클래스이며 CLS (Common Type System)의 형식을 나타냅니다.

클래스 유형, 인터페이스 유형, 배열 유형, 값 유형, 열거 유형, 유형 매개 변수, 제네릭 유형 정의, 개방형 또는 폐쇄 형 생성 제네릭 유형 등 유형 선언을 나타냅니다.

예 :

using System;
using System.Reflection;

static class ReflectionTest
{
    public static int Height;
    public static int Width;
    public static int Weight;
    public static string Name;

    public static void Write()
    {
    Type type = typeof(ReflectionTest); // Get type pointer
    FieldInfo[] fields = type.GetFields(); // Obtain all fields
    foreach (var field in fields) // Loop through fields
    {
        string name = field.Name; // Get string name
        object temp = field.GetValue(null); // Get value
        if (temp is int) // See if it is an integer.
        {
        int value = (int)temp;
        Console.Write(name);
        Console.Write(" (int) = ");
        Console.WriteLine(value);
        }
        else if (temp is string) // See if it is a string.
        {
        string value = temp as string;
        Console.Write(name);
        Console.Write(" (string) = ");
        Console.WriteLine(value);
        }
    }
    }
}

class Program
{
    static void Main()
    {
    ReflectionTest.Height = 100; // Set value
    ReflectionTest.Width = 50; // Set value
    ReflectionTest.Weight = 300; // Set value
    ReflectionTest.Name = "ShekharShete"; // Set value
    ReflectionTest.Write(); // Invoke reflection methods
    }
}

Output

Height (int) = 100
Width (int) = 50
Weight (int) = 300
Name (string) = ShekharShete

You can use reflection to implement a system of plugins for example. You just look for all DLL's in a folder and through reflection check if they implement a certain plugin interface. This is the main purpose for which I used reflection, but I also used it to implement a generic home-brew object serialization, where performance was not the greatest concern.


As mentioned above, performance will take a hit.

Another great advantage is that you can dynamically load assemblies, perform property manipulation even though you may not have the scope to see what to change, etc.

The reasons to use this are plenty. Here is an introduction if you need.


Reflection is commonly used in IoC containers. Let's say you want to register every concrete class the ends with the word "Controller". Reflection makes that a piece of cake.

I've also used reflection to manipulate private fields when unit testing classes.


The very useful XmlSerialization class relies on reflection. You don't have to deal with reflection yourself to use serialization, the serialization classes invoke reflection themselves. But it helps to tag your code with Attributes that guide how objects are serialized. The serialization classes use reflection at runtime to read those attributes. In the end, the process seems almost magical, requiring very few lines of explicit coding in a application; it's reflection that makes that convenience possible.

XmlSerialization itself is awesome not only because it is a very convenient way to create data files from an application, it's also a very easy means of generating human readable records of a program's internal data model for debugging purposes.


Coming from C++ and having needed some simple class hierarchies, I can say that the is keyword is invaluable!

class MenuItem : Item { }

foreach(Item items in parent.ChildItems) {
    if (item is MenuItem) { /* handle differently */ }
}

P.S. Isn't reflection slightly expensive, btw?

ReferenceURL : https://stackoverflow.com/questions/1458256/why-is-the-use-of-reflection-in-net-recommended

반응형