Рубрики

Позднее связывание с использованием Reflection в C #

Двумя основными терминами, фигурирующими в вышеуказанной теме, являются «Позднее связывание» и «Рефекция». Итак, давайте сначала определим эти два термина. Привязка методов и объектов во время выполнения называется Late Binding или Dynamic Binding . Отражение — это способность сборки проверять свои метаданные. Метаданные содержат информацию о данных в сборке.
Reflection используется для реализации позднего связывания, поскольку позволяет использовать код, который недоступен во время компиляции. Мы увидим примеры этого в следующих сегментах кода.

Пример 1: В этой программе мы используем позднюю привязку, потому что у нас нет знаний о классе, который должен быть создан во время компиляции. Объявите объект с именем executing класса Assembly и загрузите текущую Assembly с помощью метода GetExecutingAssembly . Затем мы должны найти тип класса, который должен быть создан позже, т.е. Student . Для этого используйте метод GetType для объекта класса Assembly и сохраните тип в другом объекте с именем studentType . Метод GetType ожидает аргумент String, который является полным именем класса, в данном случае LateBinding.Student . Так как тип неизвестен в этой точке программы, мы используем класс Type для объявления studentType . Теперь мы создаем экземпляр studentType, используя метод CreateInstance, который использует тип в качестве параметра. Класс Activator содержит методы для локального или удаленного создания типов объектов или получения ссылок на существующие удаленные объекты. Затем создайте объект MethodInfo и использовать метод GetMethod для хранения информации. Передайте имя метода в качестве аргумента в GetMethod . Чтобы вызвать GetDetails, используйте объект MethodInfo для вызова метода Invoke и передайте studentObject в качестве параметра. И , наконец, отображать детали с помощью строки ой , а также определить класс.

// C # программа для показа позднего
// Связывание с помощью Reflection

using System;

using System.Reflection;

  

namespace LateBinding {

  

class Program {

  

    // Основной метод

    static void Main(string[] args)

    {

        // Объявляем экземпляр класса Assembly

        // Вызвать метод GetExecutingAssembly

        // загрузить текущую сборку

        Assembly executing = Assembly.GetExecutingAssembly();

  

        // Найти тип ученика класса

        Type studentType = executing.GetType("LateBinding.Student");

  

        // Создание экземпляра типа Student

        object studentObject = Activator.CreateInstance(studentType);

  

        // Сохраняем информацию о методе в объекте

        // класса MethodInfo

        MethodInfo getMethod = studentType.GetMethod("GetDetails");

  

        // Для хранения необходимых параметров

        // методом GetDetails

        String[] param = new String[2];

        param[0] = "1";

        param[1] = "Lisa";

  

        // Для отображения результата метода

        String det = (String)getMethod.Invoke(studentObject, param);

        Console.WriteLine("Student Details : ");

        Console.WriteLine("Roll Number - Name \n{0}", det);

  

    } // конец Main

  

} // конец программы

  

  

public class Student {

  

    public String GetDetails(String RollNumber, String Name)

    {

        return RollNumber + " - " + Name;

    }

  

} // конец Студент

  
}

Выход:

Student Details : 
Roll Number - Name 
1 - Lisa

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

Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Parameter name: type
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at LateBinding.Program.Main(String[] args) in m:\Documents\Visual Studio 2012\Projects\LateBinding\LateBinding\Program.cs:line 19

Пример 2: Другой подобный пример — приведенный ниже код, который имеет класс Shape, и мы поздно связываем метод shapeName.

// C # программа для показа позднего
// Связывание с помощью Reflection

using System;

using System.Reflection;

  

namespace Geometry {

  
// класс Shape

public class Shape {

  

    // Функция, которая дает имя

    // форма на основе количества сторон

    // количество сторон является строкой, которая

    // содержит значение

    public String shapeName(String sideNumber)

    {

        if (sideNumber == "0" || sideNumber == "1" || sideNumber == "2")

            return "Not Valid";

        else if (sideNumber == "3")

            return "Triangle";

        else if (sideNumber == "4")

            return "Quadrilateral";

        else

            return "Polygon";

    }

  

} // конец формы

  

class Program {

  

    // Основной метод

    static void Main(string[] args)

    {

        // Объект класса Assembly

        Assembly exceutable = Assembly.GetExecutingAssembly();

  

        // Чтобы найти тип класса

        Type shapeType = exceutable.GetType("Geometry.Shape");

  

        // Создать экземпляр класса Shape

        // без предварительной информации об этом

        object shapeObject = Activator.CreateInstance(shapeType);

  

        // Найти информацию о методе

        MethodInfo shapeNameMethod = shapeType.GetMethod("shapeName");

  

        // Готовим параметры для метода

        String[] param = new String[1];

        param[0] = "4";

  

        // Для вызова метода с помощью Invoke

        String sName = (String)shapeNameMethod.Invoke(shapeObject, param);

  

        // Для отображения названия фигуры

        Console.WriteLine("Name of the Shape is {0}", sName);

  

    } // конец Main

  

} // конец программы

  
}

Выход:

Name of the Shape is Quadrilateral

Примечание . Недостатком позднего связывания является то, что если вы допустите какую-либо орфографическую ошибку в имени метода или класса, компилятор не идентифицирует ее во время компиляции, и, следовательно, код будет успешно собран. В большинстве практических сценариев используется ранняя привязка, а не поздняя привязка.

Рекомендуемые посты:

Позднее связывание с использованием Reflection в C #

0.00 (0%) 0 votes