Рефлексия - это процесс, который позволяет программе изучать саму себя.
Звучит довольно интересно и интригующе, в практике позволяет:
- перечислять члены типа
- извлекать информацию о типе
- извлекать информацию о сборке
- исследовать пользовательские атрибуты
Надо понимать, что это всё применимо для общедоступных (public) методов из заданного типа.
Рассмотрим простой пример(реализован в WPF приложение):
1. Создаём объект класса(это отдельный файл с расширением .cs).
2. При создание проекта WPF автоматически создаётся файл MainWindow.xaml с разметкой(это, то что у меня):
2.1. В этот код добавляем:
- элемент компоновки "StackPanel",
- текстовый элемент "TextBlock",
- элемент кнопки "Button"
Продолжение следует...
#Рефлексия, #Csharp, #WPF
Звучит довольно интересно и интригующе, в практике позволяет:
- перечислять члены типа
- извлекать информацию о типе
- извлекать информацию о сборке
- исследовать пользовательские атрибуты
Надо понимать, что это всё применимо для общедоступных (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.Подключаем пространство имён.
3. Метод который описывает действие, которое происходит при нажатие на кнопку(которую создали в прошлый раз).
3.1. Имя нашего текстового блока, который расположен в
нашей разметке.
3.2. Поучаем экземпляр класса Туре, в котором прописываем
"полное имя типа(нашего класса) в строковом
представлении".
3.3. Устанавливаем размер шрифта, для нашего текстового
блока.
3.4. Получаем разную информацию о классе с помощью
методов класса Type.
3.5. Получаем информацию о методах, которые существуют в
этом классе.
Рассмотрел простейшие примеры, но уже и они показывают возможности рефлексии, которые помогают нам узнать некоторые вещи.
#Рефлексия, #Csharp
Рассматриваем проект, который реализовали ранее.
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