Разделы презентаций


Язык С #

Содержание

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

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

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

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

Слайд 2Что такое рефлексия типов
В .NET рефлексия типов – это процесс

обнаружения типов во время работы программы
Класс Type из System
Пространство имен

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

Слайд 3Члены класса Type

Члены класса Type

Слайд 4Получение объекта класса Type
Foo theFoo = new Foo(); Type t =

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

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

Слайд 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{// Два

Слайд 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(

Слайд 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");
}
Выводим разную информацию о классе// Выводим разную информацию о Foopublic static void ListVariosStats(Foo f){	Console.WriteLine(

Слайд 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(

Слайд 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");
}
Выводим список интерфейсов// Выводим список всех интерфейсов, поддерживаемых Foopublic static void ListInterfaces(Foo f){	Console.WriteLine(

Слайд 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;
}
}
}

a=Assembly.Load(@“CarLibrary, Ver=1.0.454.30104, SN=null, Loc=“””);

Загрузка сборкиnamespace CarReflector // Получаем информацию о сборке CarLibrary{ using System; using System.Reflection; using System.IO;	// Нужно для

Слайд 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

Слайд 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(

Слайд 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(

Слайд 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// Создаем объект выбранного нами типа

Слайд 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

Слайд 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]=

Слайд 18Динамические сборки
Динамические сборки создаются «на лету»
Ее можно сохранить на диск
Пространство

имен System.Reflection.Emit
Класс AssemblyBuilder
Создание кода IL «на лету» в процессе выполнения

программы

Подрбнее см. Э.Троелсен «C# и платформа .NET»

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

Слайд 19Атрибуты в .NET
Атрибуты – это аннотации, который могут быть применены

к типу (интерфейсу, структуре и т.п.), члену класса (полю, свойству,

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

Слайд 20Некоторые встроенные атрибуты

Некоторые встроенные атрибуты

Слайд 21Работа с существующими атрибутами
// Этот класс можно сохранять на диске
[Serializable]
public

class Motorcycle
{
bool hasRadioSystem;
bool hasHeadSet;
bool hasBar;

//

Однако незачем утруждать себя сохранением этого поля
[NonSerialized]
float weightOfCurrentPassangers;
}

Работа с существующими атрибутами// Этот класс можно сохранять на диске[Serializable]public class Motorcycle{ bool hasRadioSystem; bool hasHeadSet; bool

Слайд 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

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


[VehicleDescriptionAttribute("A very long, slow but feature rich auto")]
public

class WinExample
{
public WinExample()

{
}
}



[VehicleDescription ("A very long, slow but feature rich auto")]
public class WinExample
{
public WinExample()
{
}

}

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

Слайд 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

Слайд 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

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

Слайд 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)	{		// Получаем объект

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика