Производительность отражения — создание делегата (свойства C#)

У меня проблемы с производительностью при использовании отражения.
Поэтому я решил создать делегаты для свойств моих объектов и на данный момент получил следующее:

TestClass cwp = new TestClass();
var propertyInt = typeof(TestClass).GetProperties().Single(obj => obj.Name == "AnyValue");
var access = BuildGetAccessor(propertyInt.GetGetMethod());
var result = access(cwp);
static Func<object, object> BuildGetAccessor(MethodInfo method)
{
    var obj = Expression.Parameter(typeof(object), "o");

    Expression<Func<object, object>> expr =
        Expression.Lambda<Func<object, object>>(
            Expression.Convert(
                Expression.Call(
                    Expression.Convert(obj, method.DeclaringType),
                    method),
                typeof(object)),
            obj);

    return expr.Compile();
}

Результаты были очень удовлетворительными, примерно в 30-40 раз быстрее, чем при использовании обычного метода ( PropertyInfo.GetValue (obj, null) ;)

Проблема в следующем: Как я могу сделать SetValueсвойства, которое работает таким же образом? К сожалению не получил способ.

Я делаю это, потому что не могу использовать методы с из-за структуры моего приложения.

25
задан GSerg 30 May 2012 в 16:43
поделиться