Быстрые способы получения значения свойства по строковому имени

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

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 обращений к свойству различными способами. В качестве эталона приведено непосредственное обращение к свойству.


Способ получения значения
свойства




Время 1000000 обращений в мс




Непосредственное обращение




3




Через делегат, созданный
CreateDelegate




29




Через динамически сгенерированную лямбду




41




Через
Reflection




7798




Конфигурация тестового ПК: Intel Core 2 Quad Q9400, 2Гб ОЗУ, Windows XP Pro SP3 x86, .Net Framework 3.5 SP1.


Исходные тексты теста

Как видно из таблицы, обращение к значению свойства через делегат или динамически сгенерированную лямбду в сотни раз быстрее обращения через Reflection и немного медленнее прямого доступа к свойству.

Комментариев нет:

Отправить комментарий