// Tools.h
////////////////////////////////////////////////////////////////////////////
#pragma once
////////////////////////////////////////////////////////////////////////////
/// Шаблонный класс извлечения атрибутов
template <typename TAttribute>
public ref class AttPtr
{
TAttribute^ attribute;
public:
/// Конструктор для объектов
AttPtr(System::Object^ obj) :
attribute(safe_cast<TAttribute^>(
Attribute::GetCustomAttribute(obj->GetType(), TAttribute::typeid)))
{ }
operator TAttribute^()
{ return attribute; }
TAttribute^ operator->()
{ return attribute; }
};
/// Макрос для обращения к атрибуту
#define ATTRIBUTE(name) AttPtr<name##Attribute>
/// <sample>
/// <standart variant>
/// MyAttribute^ a = safe_cast<MyAttribute^>(Attribute::GetCustomAttribute(obj->GetType(), MyAttribute::typeid))));
/// if (a){}
/// </standart variant>
/// <new variant>
/// if (ATTRIBUTE(My) a = obj){}
/// </new variant>
/// </sample>
////////////////////////////////////////////////////////////////////////////