Подтвердить что ты не робот

Почему рекомендуется использовать отражение в .NET?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

  • Итерация через свойства объекта.
  • Вызов метода, определенного во время выполнения.
  • Много других других в том же духе.

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

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

Ответ 3

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

Ответ 4

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

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

Класс System.Type: является основным классом для функций .NET Reflection и является основным способом доступа к метаданным. Класс System.Type является абстрактным классом и представляет собой тип в Common Type System (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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Отражение обычно используется в контейнерах IoC. Скажем, вы хотите зарегистрировать каждый конкретный класс, заканчивая словом "Контроллер". Отражение делает кусок пирога.

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

Ответ 8

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

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

Ответ 9

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

class MenuItem : Item { }

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

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