.NET Reflection - проверка информации о типе и получение атрибутов

Я видел много статей о производительности.NET Reflection, и я знаю, что вызов методов и извлечение значений свойств с использованием отражения - это дорогостоящая работа, а это примерно в 2 раза медленнее, чем прямые вызовы.

Но как насчет информации о типе и атрибутов? Я знаю, что метаданные типов кэшируются в.NET... поэтому я думаю, что это не должно быть дорогостоящим, и это похоже на поиск в словарях или в списках (но я не уверен)... Как медленно просматривается информация типа, чтобы проверить тип свойств и получить настраиваемые атрибуты для типов свойств?

Неплохая практика и дизайн, чтобы заставить многие вещи работать на основе атрибутов?

Я хочу создать некоторую инфраструктуру для ASP.NET, которая проверит множество элементов управления и типов для пользовательских атрибутов, чтобы получить информацию о необходимых файлах JavaScript и клиентском коде, которые должны быть зарегистрированы на странице.

2 ответа

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

Чтение атрибутов не медленное, но если вы заботитесь о микро-оптимизации, вы можете создать свой собственный кеш следующим образом:

static public class Metadata<t>
{
 static public readonly Type Type = typeof(T); //cache type to avoid avcessing global metadata dictionary

 static public class Attribute<tattribute>
 where TAttribute : Attribute
 {
 static public readonly TAttribute Value = Metadata<t>.Type.GetCustomAttributes(Metadata<tattribute>.Type).SingleOrDefault() as TAttribute; 
 }
}

//usage
Metadata<mytype>.Attribute<myattributetype>.Value; //exception if more then once and null if not defined.
</myattributetype></mytype></tattribute></t></tattribute></t>


Вы получите лучший ответ, если будете напрямую профилировать свои варианты использования. В конце концов, небольшое отражение не так уж плохо. Много отражения может быть. Используйте класс " Stopwatch " во время ваших альтернатив.

licensed under cc by-sa 3.0 with attribution.