Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP Part 3.DOC
Скачиваний:
42
Добавлен:
11.05.2015
Размер:
360.45 Кб
Скачать
  1. Атрибуты в среде .Net и языке c#. Создание своих атрибутов.

Атрибуты предоставляют эффективный метод связывания декларативной информации с кодом C# (типы, методы, свойства и т. д.). Атрибут, связанный с сущностью программы, может быть запрошен во время выполнения с помощью метода, называемого отражением.

Существует две формы атрибутов.

Атрибуты, которые определены в среде CLR.

Пользовательские атрибуты, которые можно создать, чтобы добавить в код дополнительные сведения. Затем эти сведения можно извлечь программным путем.

Атрибуты имеют следующие параметры.

Атрибуты добавляют в программу метаданные. Метаданные представляют собой сведения о типах, определенных в программе. Все сборки .NET содержат заданный набор метаданных, описывающий типы и члены типов, определенных в сборке. Для задания необходимых дополнительных сведений можно добавить атрибуты.

Программа может проверить собственные метаданные или метаданные в других программах с помощью отражения.

Атрибуты, например MarshallAsare, широко используемые в сценариях COM-взаимодействия.

Атрибуты могут быть размещены в большинстве объявлений, хотя определенный атрибут может ограничить типы объявлений, в которых он допустим. Синтаксически атрибут указывается путем размещения его имени, заключенного в квадратные скобки, в начале объявления сущности, к которой он применяется. Например, объявление метода с атрибутом DllImport выглядит следующим образом.

[System.Runtime.InteropServices.DllImport("user32.dll")]

extern static void SampleMethod();

Многие атрибуты имеют параметры, которые могут быть либо позиционными, неименованными, либо именованными. Именованные параметры следует указывать в определенном порядке, их нельзя опустить; именованные параметры являются необязательными и могут быть указаны в любой последовательности. Сначала указываются позиционные параметры. Например, следующие три атрибута являются эквивалентными.

[DllImport("user32.dll")]

[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]

[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

Первый параметр — имя библиотеки DLL — является позиционным и всегда стоит на первом месте; остальные являются именованными. В этом случае оба именованных параметра по умолчанию имеют значение "false" и могут быть пропущены.

В объявлении можно разместить несколько атрибутов — либо по отдельности, либо в одном наборе скобок.

void MethodA([In][Out] ref double x) { }

void MethodB([Out][In] ref double x) { }

void MethodC([In, Out] ref double x) { }

Можно создать собственные настраиваемые атрибуты, задав класс атрибутов, который явно или косвенно наследует от Attribute, что облегчает и ускоряет определение атрибутов в метаданных. Предположим, что необходимо пометить классы и структуры именем программиста, который создал класс или структуру. Можно задать класс настраиваемых атрибутов Author:

[System.AttributeUsage(System.AttributeTargets.Class |

System.AttributeTargets.Struct)

]

public class Author : System.Attribute

{

private string name;

public double version;

public Author(string name)

{

this.name = name;

version = 1.0;

}

}

В качестве имени класса используется имя атрибута Author. Он является производным от System.Attribute, следовательно, это класс настраиваемых атрибутов. Параметры конструктора являются позиционными параметрами настраиваемого атрибута, тогда name и все открытые для чтения и записи поля или свойства являются именованными параметрами, в этом случае единственным именованным параметром является version. Обратите внимание на то, что атрибут AttributeUsage используется для того, чтобы атрибут Author был действителен только для объявлений class и struct.

  1. Получение всех классов и методов в сборке .NET.

Reflection — значительное нововведение в .NET. Через Reflection программы собирают и работают со своими метаданными. Это мощный механиз для изучения assembly и разных объектов во время работы программы. Рассматриваемое API находится в System.Reflection namespace. Через Reflection можно получить информацию о классах, методах, свойствах и событиях любого объекта, а также можно вызывать методы. И т.д.

Использование Reflection для получения списка используемых assembly

using System;

using System.Reflection;

namespace ReflectionDemoCSharp

{

class ReferencedAssemblies

{

[STAThread]

static void Main(string[] args)

{

Assembly[] appAssemblies =

System.AppDomain.CurrentDomain.GetAssemblies ();

foreach (Assembly assembly in appAssemblies )

{

Console.WriteLine (assembly.FullName );

}

Console.ReadLine ();

}

}

}

Класс System.AppDomain class представляет домен приложения, который является некоей изолированной областью, в которой исполняется приложение.

Надо пояснить, что это изолированная область памяти, потоков, процессов и прочего. Для каждого приложения создается свой домен, и все необходимые assembly загружаются в домен каждого приложения. Для общения между доменами есть свои особые механизмы.

Метод GetAssemblies() возвращает список assembly, загруженных в домен ReflectionDemoCSharp.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]