Использование самостоятельно созданного атрибута
Перед тем как обсудить реализацию собственного атрибута, рассмотрим, как используется атрибут InitialDirectory. Чтобы указать начальный каталог для класса, мы сделаем класс производным от базового класса DirectoryContext. Тогда мы сможем применить к такому классу атрибут InitialDirectory, который принимает параметр типа String*, определяющий путь к начальному каталогу. Свойство DirectoryPath извлекает путь из метаданных. Если к нашему классу не применен атрибут, этот путь примет значение по умолчанию. Ниже приведен код нашей тестовой программы.
Выполняя этот пример на произвольной системе, можно сменять каталог, указанный атрибутом, на один из существующих на этой конкретной машине.
//AttributeDemo.h using namespace System; // использование пространства имен Система; using namespace System::10; // использование пространства имен Система::10; _gc class Normal: public DirectoryContext Т" }; [InitialDirectory("С:\\OI\\NetCpp\\Chap08") ] _gc class Special: public DirectoryContext // класс сборщика мусора Специальный:DirectoryContext { }; public _gc class AttributeDemo // класс сборщика мусора AttributeDemo { public: static void Main() { Normal *objNormal = new Normal; Console::WriteLine( "path = {0}", objNormal › DirectoryPath); // путь = ShowDirectoryContents(objNormal › DirectoryPath); Special *objSpecial = new Special; // новый Специальный Console::WriteLine( "path = {0}", objSpecial › DirectoryPath); // путь = ShowDirectoryContents(objSpecial › DirectoryPath); } private: static void ShowDirectoryContents(String *path) // Строка { Directorylnfo *dir = new Directorylnfo(path); // путь Filelnfo *files[] = dir › GetFiles(); Console::WriteLine("Files:"); // Файлы: lEnumerator *pEnum = files › GetEnumerator(); // файлы while (pEnum › MoveNext()) { Filelnfo *f = dynamic_cast<File!nfo *>(pEnum › Current); Console::WriteLine(" {0}", f › Name); // Имя } Directorylnfo *dirs [] = dir › GetDirectories( }; Console::WriteLine("Directories:"); // Каталоги: pEnum = dirs › GetEnumerator(); while (pEnum › MoveNext() } { Directorylnfo *d = dynamic_cast<Directory!nfo *>(pEnum › Current); Console::WriteLine(" {0}", d › Name); // Имя } } };
Вот выдача:
path = c:\OI\NetCpp\Chap08\CustomAttribute // путь Files: // Файлы CustomAttribute.vcproj CustomAttribute.neb ReadMe.txt CustomAttribute.cpp Assemblylnfо.cpp stdafx.cpp stdafx.h CustomAttribute.sin CustomAttribute.suo AttributeDemo.h DirectoryContext.h DirectoryAttribute.h Directories: // Каталоги Debug // Отладка path = C:\OI\NetCpp\Chap08 // путь Files: // Файлы Directories: // Каталоги Reflection // Отражение Dynamic // Динамический Filel() Serialization // Преобразование в последовательную форму Hotel // Гостиница ISerialization Threading PulseAll Threadlsolation AppDomain Asynch AsynchThreading CustomAttribute MarshalByReference Remoting