1. Обращение к свойству путём создания делегата вызовом Delegate.CreateDelegate()
Пример.
public class Test
{
public int Value1 { get; set; }
}
var del = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), test, typeof(Test).GetProperty(“Value1”).GetGetMethod());
var value = del();//Получим значение свойства
* This source code was highlighted with Source Code Highlighter.
2. Обращение к свойству путём динамической генерации лямбды вида ()=>obj.PropertyName
var expression = Expression.Lambda<Func<int>>
(
Expression.Property(Expression.Constant(test, typeof(Test)), “Value1”)
);
var del = expression.Compile();
var value = del();//Получим значение свойства
* This source code was highlighted with Source Code Highlighter.
В следующей таблице приведено время, которое потребовалось для выполнения 1000000 обращений к свойству различными способами. В качестве эталона приведено непосредственное обращение к свойству.
|
|
|
|
|
|
|
|
|
|
Конфигурация тестового ПК: Intel Core 2 Quad Q9400, 2Гб ОЗУ, Windows XP Pro SP3 x86, .Net Framework 3.5 SP1.
Исходные тексты теста
Как видно из таблицы, обращение к значению свойства через делегат или динамически сгенерированную лямбду в сотни раз быстрее обращения через Reflection и немного медленнее прямого доступа к свойству.
Комментариев нет:
Отправить комментарий