🗊Презентация Рефлексия типов и программирование с использованием атрибутов

Нажмите для полного просмотра!
Рефлексия типов и программирование с использованием атрибутов, слайд №1Рефлексия типов и программирование с использованием атрибутов, слайд №2Рефлексия типов и программирование с использованием атрибутов, слайд №3Рефлексия типов и программирование с использованием атрибутов, слайд №4Рефлексия типов и программирование с использованием атрибутов, слайд №5Рефлексия типов и программирование с использованием атрибутов, слайд №6Рефлексия типов и программирование с использованием атрибутов, слайд №7Рефлексия типов и программирование с использованием атрибутов, слайд №8Рефлексия типов и программирование с использованием атрибутов, слайд №9Рефлексия типов и программирование с использованием атрибутов, слайд №10Рефлексия типов и программирование с использованием атрибутов, слайд №11Рефлексия типов и программирование с использованием атрибутов, слайд №12Рефлексия типов и программирование с использованием атрибутов, слайд №13Рефлексия типов и программирование с использованием атрибутов, слайд №14Рефлексия типов и программирование с использованием атрибутов, слайд №15Рефлексия типов и программирование с использованием атрибутов, слайд №16Рефлексия типов и программирование с использованием атрибутов, слайд №17Рефлексия типов и программирование с использованием атрибутов, слайд №18Рефлексия типов и программирование с использованием атрибутов, слайд №19Рефлексия типов и программирование с использованием атрибутов, слайд №20Рефлексия типов и программирование с использованием атрибутов, слайд №21Рефлексия типов и программирование с использованием атрибутов, слайд №22Рефлексия типов и программирование с использованием атрибутов, слайд №23Рефлексия типов и программирование с использованием атрибутов, слайд №24Рефлексия типов и программирование с использованием атрибутов, слайд №25Рефлексия типов и программирование с использованием атрибутов, слайд №26Рефлексия типов и программирование с использованием атрибутов, слайд №27Рефлексия типов и программирование с использованием атрибутов, слайд №28

Содержание

Вы можете ознакомиться и скачать презентацию на тему Рефлексия типов и программирование с использованием атрибутов. Доклад-сообщение содержит 28 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Язык С#
Рефлексия типов и программирование с использованием атрибутов

Лекция #6
Описание слайда:
Язык С# Рефлексия типов и программирование с использованием атрибутов Лекция #6

Слайд 2





Что такое рефлексия типов
В .NET рефлексия типов – это процесс обнаружения типов во время работы программы
Класс Type из System
Пространство имен System.Reflection
Описание слайда:
Что такое рефлексия типов В .NET рефлексия типов – это процесс обнаружения типов во время работы программы Класс Type из System Пространство имен System.Reflection

Слайд 3





Члены класса Type
Описание слайда:
Члены класса Type

Слайд 4





Получение объекта класса Type
Foo theFoo = new Foo();
Type t = theFoo.GetType();

Type t = null;
t = Type.GetType("Foo");

Type t = typeof(Foo)
Описание слайда:
Получение объекта класса Type Foo theFoo = new Foo(); Type t = theFoo.GetType(); Type t = null; t = Type.GetType("Foo"); Type t = typeof(Foo)

Слайд 5





Тестовый класс Foo
// Мы сможем получить разнообразную информацию об этом классе во время выполнения 
namespace TheType
{
// Два интерфейса
public interface IFaceOne { void MethodA(); }
public interface IFaceTwo { void MethodB(); }
public class Foo: IFaceOne, IFaceTwo // Класс Foo поддерживает эти два интерфейса
{
		public int myIntField;        // Поля
		public string myStringField;
		public void myMethod(int p1, string p2) {...} // Метод
		public int MyProp 	// Свойство
		{	get { return myIntField; }
			set { myIntField = value; }
		}
		// Методы интерфейсов IFaceOne и IFaceTwo
		public void MethodA() {...}
		public void MethodB() {...}
 }
}
Описание слайда:
Тестовый класс Foo // Мы сможем получить разнообразную информацию об этом классе во время выполнения namespace TheType { // Два интерфейса public interface IFaceOne { void MethodA(); } public interface IFaceTwo { void MethodB(); } public class Foo: IFaceOne, IFaceTwo // Класс Foo поддерживает эти два интерфейса { public int myIntField; // Поля public string myStringField; public void myMethod(int p1, string p2) {...} // Метод public int MyProp // Свойство { get { return myIntField; } set { myIntField = value; } } // Методы интерфейсов IFaceOne и IFaceTwo public void MethodA() {...} public void MethodB() {...} } }

Слайд 6





Получаем информацию о полях и методах
	public static void ListMethods (Foo f)
	{
		Console.WriteLine("***** Methods of Foo *****");
		Type t = f.GetType();
		MethodInfo[] mi = t.GetMethods();
		foreach(MethodInfo m in mi)
			Console.WriteLine("Method: {0}", m.Name);
		Console.WriteLine("*************************\n");
	}
	public static void ListFields(Foo f)
	{
		Console.WriteLine("***** Fields of Foo *****");
		Type t = f.GetType();
		FieldInfo[] fi = t.GetFields();
		foreach(FieldInfo field in fi)
			Console.WriteLine("Field: {0}", field.Name);
		Console.WriteLine("*************************\n");
	}
Описание слайда:
Получаем информацию о полях и методах public static void ListMethods (Foo f) { Console.WriteLine("***** Methods of Foo *****"); Type t = f.GetType(); MethodInfo[] mi = t.GetMethods(); foreach(MethodInfo m in mi) Console.WriteLine("Method: {0}", m.Name); Console.WriteLine("*************************\n"); } public static void ListFields(Foo f) { Console.WriteLine("***** Fields of Foo *****"); Type t = f.GetType(); FieldInfo[] fi = t.GetFields(); foreach(FieldInfo field in fi) Console.WriteLine("Field: {0}", field.Name); Console.WriteLine("*************************\n"); }

Слайд 7





Выводим разную информацию о классе
// Выводим разную информацию о Foo
public static void ListVariosStats(Foo f)
{
	Console.WriteLine("***** Various stats about Foo *****");
	Type t = f.GetType();
	Console.WriteLine("Full name is: {0}", t.FullName);
	Console.WriteLine("Base is: {0}", t.BaseType);
	Console.WriteLine("Is it abstract? {0}", t.IsAbstract);
	Console.WriteLine("Is it a COM object? {0}", t.IsCOMObject);
	Console.WriteLine("Is it sealed? {0}", t.IsSealed);
	Console.WriteLine("Is it a class? {0}", t.IsClass);
	Console.WriteLine("**************************\n");
}
Описание слайда:
Выводим разную информацию о классе // Выводим разную информацию о Foo public static void ListVariosStats(Foo f) { Console.WriteLine("***** Various stats about Foo *****"); Type t = f.GetType(); Console.WriteLine("Full name is: {0}", t.FullName); Console.WriteLine("Base is: {0}", t.BaseType); Console.WriteLine("Is it abstract? {0}", t.IsAbstract); Console.WriteLine("Is it a COM object? {0}", t.IsCOMObject); Console.WriteLine("Is it sealed? {0}", t.IsSealed); Console.WriteLine("Is it a class? {0}", t.IsClass); Console.WriteLine("**************************\n"); }

Слайд 8





Выводим список свойств
// Выводим список всех свойств
public static void ListPorps(Foo f)
{
	Console.WriteLine("***** Properties of Foo *****");
	Type t = f.GetType();
	PropertyInfo[] pi = t.GetProperties();
	foreach(PropertyInfo prop in pi)
		Console.WriteLine("Prop: {0}", prop.Name);
	Console.WriteLine("**************************\n");
}
Описание слайда:
Выводим список свойств // Выводим список всех свойств public static void ListPorps(Foo f) { Console.WriteLine("***** Properties of Foo *****"); Type t = f.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach(PropertyInfo prop in pi) Console.WriteLine("Prop: {0}", prop.Name); Console.WriteLine("**************************\n"); }

Слайд 9





Выводим список интерфейсов
// Выводим список всех интерфейсов, поддерживаемых Foo
public static void ListInterfaces(Foo f)
{
	Console.WriteLine("***** Interfaces of Foo *****");
	Type t = f.GetType();
	Type[] ifaces = t.GetInterfaces();
	foreach(Type i in ifaces)
		Console.WriteLine("Interface: {0}", i.Name);
	Console.WriteLine("**************************\n");
}
Описание слайда:
Выводим список интерфейсов // Выводим список всех интерфейсов, поддерживаемых Foo public static void ListInterfaces(Foo f) { Console.WriteLine("***** Interfaces of Foo *****"); Type t = f.GetType(); Type[] ifaces = t.GetInterfaces(); foreach(Type i in ifaces) Console.WriteLine("Interface: {0}", i.Name); Console.WriteLine("**************************\n"); }

Слайд 10





Типы пространства имен System.Reflection
Описание слайда:
Типы пространства имен System.Reflection

Слайд 11





Загрузка сборки
namespace CarReflector  // Получаем информацию о сборке CarLibrary
{
  using System;
  using System.Reflection;
  using System.IO;	// Нужно для использования FileNotFoundException 
public class CarReflector
{
	public static int Main(string[] args)
	{
 	// Используем метод Assembly.Load() для загрузки сборки 
	Assembly a = null;
	
	try
		{  a=Assembly.Load("CarLibrary");
		}
	
 	catch (FileNotFoundException e)
		{Console.WriteLine(e.Message);}
			return 0;
		}
}
}
Описание слайда:
Загрузка сборки namespace CarReflector // Получаем информацию о сборке CarLibrary { using System; using System.Reflection; using System.IO; // Нужно для использования FileNotFoundException public class CarReflector { public static int Main(string[] args) { // Используем метод Assembly.Load() для загрузки сборки Assembly a = null; try { a=Assembly.Load("CarLibrary"); } catch (FileNotFoundException e) {Console.WriteLine(e.Message);} return 0; } } }

Слайд 12





Вывод информации о типах в сборке
public class CarReflector
{
  public static int Main(string[] args)
  {
	Assembly a = null;
	try    	 { a=Assembly.Load("CarLibrary"); }
	catch(FileNotFoundException e) {Console.WriteLine(e.Message);}
	ListAllTypes(a);
	return 0;
  }
		
  // Выводим информацию о всех типах в сборке
  private static void ListllTypes(Assembly a)
  {
    Console.WriteLine("Listing all types in {0}", a.FullName);
    Type[] types = a.GetTypes();
    foreach(Type t in types)
			Console.WriteLine("Type: {0}", t);
	}
}
Описание слайда:
Вывод информации о типах в сборке public class CarReflector { public static int Main(string[] args) { Assembly a = null; try { a=Assembly.Load("CarLibrary"); } catch(FileNotFoundException e) {Console.WriteLine(e.Message);} ListAllTypes(a); return 0; } // Выводим информацию о всех типах в сборке private static void ListllTypes(Assembly a) { Console.WriteLine("Listing all types in {0}", a.FullName); Type[] types = a.GetTypes(); foreach(Type t in types) Console.WriteLine("Type: {0}", t); } }

Слайд 13





Вывод информации о членах класса
private static void ListAllMembers(Assembly a)
{
	Type miniVan = a.GetType("CarLibrary.MiniVan");
	
	Console.WriteLine("Listing all members for {0}", miniVan);
	MemberInfo[] mi = miniVan.GetMembers();
	foreach(MemberInfo m in mi)
		Console.WriteLine("Type {0}: {1} ",
				m.MemberType.ToString(), m);
}
Описание слайда:
Вывод информации о членах класса private static void ListAllMembers(Assembly a) { Type miniVan = a.GetType("CarLibrary.MiniVan"); Console.WriteLine("Listing all members for {0}", miniVan); MemberInfo[] mi = miniVan.GetMembers(); foreach(MemberInfo m in mi) Console.WriteLine("Type {0}: {1} ", m.MemberType.ToString(), m); }

Слайд 14





Вывод информации о параметрах метода
private static void GetParams(Assembly a)
{
	Type miniVan = a.GetType("CarLibrary.MiniVan");
	MethodInfo mi = miniVan.GetMethod("TurnOnRadio");	
	Console.WriteLine("Here are the params for {0}", mi.Name);
 
	// Show number of params.
	ParameterInfo[] myParams = mi.GetParameters();
	Console.WriteLine("Method has {0} params", myParams.Length);
		
	// Show info about param.
	foreach(ParameterInfo pi in myParams)
	{
 	Console.WriteLine("Param name: {0}", pi.Name);
	Console.WriteLine("Position in method: {0}", pi.Position);	
	Console.WriteLine("Param type: {0}", pi.ParameterType);
	}
}
Описание слайда:
Вывод информации о параметрах метода private static void GetParams(Assembly a) { Type miniVan = a.GetType("CarLibrary.MiniVan"); MethodInfo mi = miniVan.GetMethod("TurnOnRadio"); Console.WriteLine("Here are the params for {0}", mi.Name); // Show number of params. ParameterInfo[] myParams = mi.GetParameters(); Console.WriteLine("Method has {0} params", myParams.Length); // Show info about param. foreach(ParameterInfo pi in myParams) { Console.WriteLine("Param name: {0}", pi.Name); Console.WriteLine("Position in method: {0}", pi.Position); Console.WriteLine("Param type: {0}", pi.ParameterType); } }

Слайд 15





Позднее связывание и класс System.Activator
// Создаем объект выбранного нами типа "на лету"
public class LateBind
{
	public static int Main(string[] args)
	{
		// Используем класс Assembly для загрузки сборки
		Assembly a = null;
		try
		{
			a = Assembly.Load("CarLibrary");
		}
		catch(FileNotFoundException e)
		{Console.WriteLine(e.Message);}
		// Получаем объект Type для класса MiniVan
		Type miniVan = a.GetType("CarLibrary.MiniVan");

		// Создаем объект класса MiniVan "на лету"
		object obj = Activator.CreateInstance(miniVan);
	}
}
Описание слайда:
Позднее связывание и класс System.Activator // Создаем объект выбранного нами типа "на лету" public class LateBind { public static int Main(string[] args) { // Используем класс Assembly для загрузки сборки Assembly a = null; try { a = Assembly.Load("CarLibrary"); } catch(FileNotFoundException e) {Console.WriteLine(e.Message);} // Получаем объект Type для класса MiniVan Type miniVan = a.GetType("CarLibrary.MiniVan"); // Создаем объект класса MiniVan "на лету" object obj = Activator.CreateInstance(miniVan); } }

Слайд 16





Использование позднего связывания
public static int Main(string[] args)
{
	// Загружаем CarLibrary при помощи класса Assembly
	...
	// Получаем объект типа Type
	Type miniVan = a.GetType("CarLibrary.MiniVan");
	// Создаем объект класса MiniVan "на лету"
	object obj = Activator.CreateInstance(miniVan);

	// Получаем объект класса MethodInfo для метода TurboBoost() 
	MethodInfo mi = miniVan.GetMethod("TurboBoost");

	// Вызываем метод (передаем null вместо параметров)
	mi.invoke(obj, null);
	return 0;
}
Описание слайда:
Использование позднего связывания public static int Main(string[] args) { // Загружаем CarLibrary при помощи класса Assembly ... // Получаем объект типа Type Type miniVan = a.GetType("CarLibrary.MiniVan"); // Создаем объект класса MiniVan "на лету" object obj = Activator.CreateInstance(miniVan); // Получаем объект класса MethodInfo для метода TurboBoost() MethodInfo mi = miniVan.GetMethod("TurboBoost"); // Вызываем метод (передаем null вместо параметров) mi.invoke(obj, null); return 0; }

Слайд 17





Вызов метода с параметрами
	object[] paramArray = new object[2];
	paramArray[0]="Fred";
	paramArray[1]= 4;

   MethodInfo mi = miniVan.GetMethod("TellChildToBeQuiet");

	// Вызываем метод
	mi.invoke(obj, paramArray);
Описание слайда:
Вызов метода с параметрами object[] paramArray = new object[2]; paramArray[0]="Fred"; paramArray[1]= 4; MethodInfo mi = miniVan.GetMethod("TellChildToBeQuiet"); // Вызываем метод mi.invoke(obj, paramArray);

Слайд 18





Динамические сборки
Динамические сборки создаются «на лету»
Ее можно сохранить на диск
Пространство имен System.Reflection.Emit
Класс AssemblyBuilder
Создание кода IL «на лету» в процессе выполнения программы
Описание слайда:
Динамические сборки Динамические сборки создаются «на лету» Ее можно сохранить на диск Пространство имен System.Reflection.Emit Класс AssemblyBuilder Создание кода IL «на лету» в процессе выполнения программы

Слайд 19





Атрибуты в .NET
Атрибуты – это аннотации, который могут быть применены к типу (интерфейсу, структуре и т.п.), члену класса (полю, свойству, методу)
Многие атрибуты предназначены для «хитрых» целей: отладки, взаимодействию с COM
Описание слайда:
Атрибуты в .NET Атрибуты – это аннотации, который могут быть применены к типу (интерфейсу, структуре и т.п.), члену класса (полю, свойству, методу) Многие атрибуты предназначены для «хитрых» целей: отладки, взаимодействию с COM

Слайд 20





Некоторые встроенные атрибуты
Описание слайда:
Некоторые встроенные атрибуты

Слайд 21





Работа с существующими атрибутами
// Этот класс можно сохранять на диске
[Serializable]
public class Motorcycle
{
  bool hasRadioSystem;
  bool hasHeadSet;
  bool hasBar;
  
  // Однако незачем утруждать себя сохранением этого поля
  [NonSerialized]
  float weightOfCurrentPassangers;
}
Описание слайда:
Работа с существующими атрибутами // Этот класс можно сохранять на диске [Serializable] public class Motorcycle { bool hasRadioSystem; bool hasHeadSet; bool hasBar; // Однако незачем утруждать себя сохранением этого поля [NonSerialized] float weightOfCurrentPassangers; }

Слайд 22





Создание пользовательских атрибутов

public class VehicleDescriptionAttribute : System.Attribute
{
    private string description;
    public string Desc
	{
		get { return description; }
		set { description = value; }
	}
    public VehicleDescriptionAttribute() {}
    public VehicleDescriptionAttribute(string desc) 
	     { description = desc;}
}
Описание слайда:
Создание пользовательских атрибутов public class VehicleDescriptionAttribute : System.Attribute { private string description; public string Desc { get { return description; } set { description = value; } } public VehicleDescriptionAttribute() {} public VehicleDescriptionAttribute(string desc) { description = desc;} }

Слайд 23





Применение пользовательских атрибутов

[VehicleDescriptionAttribute("A very long, slow but feature rich auto")]
public class WinExample
{
        public WinExample()
        {
        }
}
Описание слайда:
Применение пользовательских атрибутов [VehicleDescriptionAttribute("A very long, slow but feature rich auto")] public class WinExample { public WinExample() { } }

Слайд 24





Ограничение использования атрибута
// Это перечисление позволяет определить, к чему можно будет
// применять пользовательский атрибут 
public enum AttributeTargets
{
		All,
		Assembly,
		Class,
		Constructor,
		Delegate,
		Enum,
		Event,
		Field,
		Interface,
		Method,
		Module,
		Parameter,
		Property,
		ReturnValue,
		Struct,
}
Описание слайда:
Ограничение использования атрибута // Это перечисление позволяет определить, к чему можно будет // применять пользовательский атрибут public enum AttributeTargets { All, Assembly, Class, Constructor, Delegate, Enum, Event, Field, Interface, Method, Module, Parameter, Property, ReturnValue, Struct, }

Слайд 25





Ограничение использования атрибута
namespace CustomAtt
{
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

public class VehicleDescriptionAttribute : System.Attribute
{
    private string description;
    public string Desc
	{
		get { return description; }
		set { description = value; }
	}
    public VehicleDescriptionAttribute() {}
    public VehicleDescriptionAttribute(string desc) 
	     { description = desc;}
 }
}
Описание слайда:
Ограничение использования атрибута namespace CustomAtt { using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class VehicleDescriptionAttribute : System.Attribute { private string description; public string Desc { get { return description; } set { description = value; } } public VehicleDescriptionAttribute() {} public VehicleDescriptionAttribute(string desc) { description = desc;} } }

Слайд 26





Аттрибуты уровня сборки и модуля
// Гарантируем совместимость с CLS
using System;
[assembly:System.ClsCompliantAttribute(true)]

namespace MyAttributes
{
[VehicleDescription ("A very long, slow but feature rich auto")]
public class WinExample
{
		public WinExample(){}
            // public ulong notCompilant
}
}
Описание слайда:
Аттрибуты уровня сборки и модуля // Гарантируем совместимость с CLS using System; [assembly:System.ClsCompliantAttribute(true)] namespace MyAttributes { [VehicleDescription ("A very long, slow but feature rich auto")] public class WinExample { public WinExample(){} // public ulong notCompilant } }

Слайд 27





Файл AssemblyInfo.cs
Описание слайда:
Файл AssemblyInfo.cs

Слайд 28





Аттрибуты уровня сборки и модуля
// Рефлексия для пользовательских атрибутов
public class AttReader
{
	public static int Main(string[] args)
	{
		// Получаем объект класса Type для Winnebago
		Type t = typeof(WinExample);
		// Получаем все атрибуты данной сборки
		object[] customAtts = t.GetCustomAttributes(false);

		// Выводим информацию о каждом атрибуте
		foreach(VehicleDescriptionAttribute v in customAtts)
				Console.WriteLine(v.Desc);
		return 0;
	}
}
Описание слайда:
Аттрибуты уровня сборки и модуля // Рефлексия для пользовательских атрибутов public class AttReader { public static int Main(string[] args) { // Получаем объект класса Type для Winnebago Type t = typeof(WinExample); // Получаем все атрибуты данной сборки object[] customAtts = t.GetCustomAttributes(false); // Выводим информацию о каждом атрибуте foreach(VehicleDescriptionAttribute v in customAtts) Console.WriteLine(v.Desc); return 0; } }



Похожие презентации
Mypresentation.ru
Загрузить презентацию