Ежедневник IT-ка
130 subscribers
24 photos
4 videos
1 file
44 links
Программируем на практике!!
По вопросам по поводу проектов: @vladimir_dzen
Download Telegram
​​Рефлексия - это процесс, который позволяет программе изучать саму себя.
Звучит довольно интересно и интригующе, в практике позволяет:
- перечислять члены типа
- извлекать информацию о типе
- извлекать информацию о сборке
- исследовать пользовательские атрибуты
Надо понимать, что это всё применимо для общедоступных (public) методов из заданного типа.

Рассмотрим простой пример(реализован в WPF приложение):

1. Создаём объект класса(это отдельный файл с расширением .cs).

namespace HumanizerDemo
{
  public class Binance
  {
    public int BalanceUSD { get; set; }
    public int BalanceBTC { get; set; }
    public Binance(int n, int a)
    {
      BalanceUSD = n;
      BalanceBTC = a;
    }

    public int CalculateCount(int countUsd, int priceBtc)
    {
      return countUsd / priceBtc;
    }
  }
}

2. При создание проекта WPF автоматически создаётся файл MainWindow.xaml с разметкой(это, то что у меня):

<Window x:Class="HumanizerDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:HumanizerDemo"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
  <Grid>

  </Grid>
</Window>

2.1. В этот код добавляем:

- элемент компоновки "StackPanel",
- текстовый элемент "TextBlock",
- элемент кнопки "Button"

  <Grid>
    <StackPanel>
      <Button Name="GetHumanMethodNames" Click="GetHumanMethodNames_OnClick">Получение методов</Button>
      <TextBlock Name="Output"></TextBlock>
    </StackPanel>
  </Grid>

Продолжение следует...

#Рефлексия, #Csharp, #WPF
​​Продолжаем знакомство с рефлексией, и будем получать информацию о классе и о методах в нём.

Рассматриваем проект, который реализовали ранее.

1. Открываем файл "MainWindow.xaml.cs", который был создан автоматически.

2.Подключаем пространство имён.

using System;
using System.Reflection;
using System.Windows;

3. Метод который описывает действие, которое происходит при нажатие на кнопку(которую создали в прошлый раз).

    private void GetHumanMethodNames_OnClick(object sender, RoutedEventArgs e)
    {

3.1. Имя нашего текстового блока, который расположен в
нашей разметке.

      Output.Text = "";

3.2. Поучаем экземпляр класса Туре, в котором прописываем
"полное имя типа(нашего класса) в строковом
представлении".

var infoAboutClass = Type.GetType("HumanizerDemo.Binance",false,true);

3.3. Устанавливаем размер шрифта, для нашего текстового
блока.

      Output.FontSize = 16;

3.4. Получаем разную информацию о классе с помощью
методов класса Type.

      Output.Text += "Получаем разную информацию о классе с помощью методов класса Type";
      Output.Text += Environment.NewLine;
      Output.Text += Environment.NewLine;
      Output.Text += "Полное Имя: " + infoAboutClass.FullName;
      Output.Text += Environment.NewLine;
      Output.Text += "Базовый класс: " + infoAboutClass.BaseType.ToString();
      Output.Text += Environment.NewLine;
      Output.Text += "Абстрактный: " + infoAboutClass.IsAbstract.ToString();
      Output.Text += Environment.NewLine;
      Output.Text += "Запрещено наследование: " + infoAboutClass.IsSealed.ToString();
      Output.Text += Environment.NewLine;
      Output.Text += "class: " + infoAboutClass.IsClass.ToString();
      Output.Text += Environment.NewLine;
      Output.Text += "Публичный: " + infoAboutClass.IsPublic.ToString();
      Output.Text += Environment.NewLine;
      Output.Text += Environment.NewLine;

3.5. Получаем информацию о методах, которые существуют в
этом классе.

      MethodInfo[] mi = infoAboutClass.GetMethods(BindingFlags.Instance
          | BindingFlags.Static
          | BindingFlags.Public
          | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

      Output.Text += "Получаем информацию о методах";
      Output.Text += Environment.NewLine;
      Output.Text += Environment.NewLine;
      foreach (MethodInfo imi in mi)
      {
        Output.Text += "Полное Имя: " + imi.Name.ToString();
        Output.Text += Environment.NewLine;
      }
    }

Рассмотрел простейшие примеры, но уже и они показывают возможности рефлексии, которые помогают нам узнать некоторые вещи.

#Рефлексия, #Csharp