Почему рекомендуется использовать отражение в .NET? - PullRequest
55 голосов
/ 22 сентября 2009

Это определенно хорошая практика, чтобы использовать его?

Какие возможные ситуации в проекте требуют отражения?

Ответы [ 9 ]

36 голосов
/ 22 сентября 2009

Основная ценность Reflection заключается в том, что его можно использовать для проверки сборок, типов и элементов. Это очень мощный инструмент для определения содержимого неизвестной сборки или объекта и может использоваться в самых разных случаях.

Противники Reflection будут ссылаться на то, что он медленный, что справедливо по сравнению со статическим выполнением кода - однако Reflection используется во всей среде .NET, и при условии, что он не используется, он может быть очень мощным инструментом в наборе инструментов .

Некоторые полезные приложения:

  • Определение зависимостей сборки

  • Типы местоположений, которые соответствуют интерфейсу, наследуются от базового / абстрактного класса и ищут элементы по атрибутам

  • (Вонючее) тестирование - если вы зависите от класса, который не тестируется (то есть не позволяет легко создавать фальшивку), вы можете использовать Reflection для внедрения фальшивых значений в класс - это не очень красиво и не рекомендуется, но это может быть удобным инструментом в безвыходном положении.

  • Отладка - вывод списка загруженных сборок, их ссылок, текущих методов и т. Д. *

31 голосов
/ 22 сентября 2009

Существует много вариантов использования отражения:

  1. Перебор свойств объекта.
  2. Вызов метода, определенного во время выполнения.
  3. Многие другие в том же духе.

Однако одно из моих любимых применений отражения - это поиск свойств, помеченных атрибутами.

Например, я написал атрибуты, которые отмечают, какие свойства в моих классах должны быть проиндексированы с помощью Lucene. Во время выполнения я могу посмотреть на любой класс и выяснить, какие поля нужно проиндексировать, просто запросив у класса «помеченные» свойства.

24 голосов
/ 22 сентября 2009

Отражение - это просто способ исследования объектов во время выполнения. Вы не должны использовать его, если вам не нужно это делать.

13 голосов
/ 29 мая 2012

Отражение позволяет приложению собирать информацию о себе, а также манипулировать собой. Его можно использовать для поиска всех типов в сборке и / или динамического вызова методов в сборке.

System.Reflection: пространство имен содержит классы и интерфейсы, которые обеспечивают управляемое представление загруженных типов, методов и полей с возможностью динамического создания и вызова типов; этот процесс известен как Отражение в .NET Framework.

System.Type: class является основным классом для функциональности .NET Reflection и основным способом доступа к метаданным. Класс System.Type является абстрактным классом и представляет тип в общей системе типов (CLS).

Он представляет объявления типов: типы классов, типы интерфейсов, типы массивов, типы значений, типы перечисления, параметры типов, определения универсальных типов и открытые или закрытые построенные универсальные типы.

Например:

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
8 голосов
/ 22 сентября 2009

Например, вы можете использовать отражение для реализации системы плагинов. Вы просто просматриваете все библиотеки DLL в папке и проверяете отражение, реализуют ли они определенный интерфейс плагина. Это основная цель, для которой я использовал рефлексию, но я также использовал ее для реализации универсальной сериализации объектов домашнего приготовления, где производительность не была главной проблемой.

6 голосов
/ 22 сентября 2009

Отражение обычно используется в контейнерах IoC. Допустим, вы хотите зарегистрировать каждый конкретный класс, заканчивающийся словом «Controller». Отражение превращает это в кусок пирога.

Я также использовал рефлексию для управления приватными полями при юнит-тестировании классов.

6 голосов
/ 22 сентября 2009

Как уже упоминалось выше, производительность получит удар.

Другим большим преимуществом является то, что вы можете динамически загружать сборки, выполнять манипуляции со свойствами, даже если у вас может не быть области, чтобы увидеть, что изменить, и т. Д.

Причин для использования этого достаточно. Вот введение , если вам нужно.

2 голосов
/ 06 февраля 2013

Очень полезный класс XmlSerialization основан на рефлексии. Вам не нужно иметь дело с рефлексией самостоятельно, чтобы использовать сериализацию, классы сериализации сами вызывают рефлексию. Но это помогает пометить ваш код с помощью атрибутов, которые определяют порядок сериализации объектов. Классы сериализации используют отражение во время выполнения для чтения этих атрибутов. В конце концов, процесс кажется почти волшебным, требующим очень мало строк явного кодирования в приложении; это отражение делает возможным такое удобство.

XmlSerialization сама по себе является удивительной не только потому, что это очень удобный способ создания файлов данных из приложения, но и очень простой способ создания удобочитаемых записей внутренней модели данных программы для целей отладки.

0 голосов
/ 22 сентября 2009

Исходя из C ++ и нуждаясь в некоторых простых иерархиях классов, я могу сказать, что ключевое слово is неоценимо!

class MenuItem : Item { }

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

P.S. Разве отражение не слишком дорого, кстати?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...