Слайд 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");
}
Слайд 10Типы пространства имен 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=“””);
Слайд 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);
}
}
Слайд 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);
}
Слайд 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);
}
}
Слайд 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);
}
}
Слайд 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;
}
Слайд 17Вызов метода с параметрами
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 «на лету» в процессе выполнения
программы
Подрбнее см. Э.Троелсен «C# и платформа .NET»
Слайд 19Атрибуты в .NET
Атрибуты – это аннотации, который могут быть применены
к типу (интерфейсу, структуре и т.п.), члену класса (полю, свойству,
методу)
Многие атрибуты предназначены для «хитрых» целей: отладки, взаимодействию с COM
Слайд 21Работа с существующими атрибутами
// Этот класс можно сохранять на диске
[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;}
}
Слайд 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()
{
}
}
Слайд 24Ограничение использования атрибута
// Это перечисление позволяет определить, к чему можно
будет
// применять пользовательский атрибут
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;}
}
}
Слайд 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
}
}
Слайд 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;
}
}