Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public class DynamicViewModel : DynamicObject, INotifyPropertyChanged
{
/*...*/
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string propertyName = binder.Name;
PropertyInfo property = _model.GetType().GetProperty(propertyName);
if (property == null || property.CanRead == false)
{
result = null;
return false;
}
result = property.GetValue(_model, null);
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
string propertyName = binder.Name;
PropertyInfo property = _model.GetType().GetProperty(propertyName);
if (property == null || property.CanWrite == false)
return false;
property.SetValue(_model, value, null);
OnPropertyChanged(propertyName);
return true;
}
}
при названии статьи «Измеряем производительность ...» хотелось бы видеть таблички с замерами
а уж если даете ссылки на «похожий подход», то и сравнения подходов
TransactionScope или например засунуть все вызовы в Task.Factory.StartNew(), но на практике когда вы начинаете действительно “мешать” аспекты (например, многопооточность+транзакции+stream processing), никакой PostSharp не даст вам возможность декларативно правильно и быстро описать взаимодействие компонент – уровень гранулярности совсем не тот.А пример кода в статье мне нравится – мне кажется что по сути дела можно попробовать как-то контролировать эту “динамическую подмену” в IoC-контейнере и тем самым профилировать определенные участки кода. (Хотя профиляторы тоже никто не отменял.)
Для таких вещей есть DynamicProxy От Castle'a
Кстати если вызывать методы не через ревлекшн а через экспрешны будет значительно быстрее.
У вашего кода есть крупный недостаток: он не type-safe.
Для обертки вокруг reflection это оправданно, для обертки вокруг класса с известным во время компиляции публичным интерфейсом — нет.
Такие вещи «традиционно» делаются через «динамические прокси».
Подобного рода «проверочный код» регулярно просачивается в продакшн-код.
если бы вам не надо было реальное использование, вы бы написали тест
Собственно, весь смысл враппера в том, чтобы не знать, что мы вызываем.
Ко второму, очевидно. Вы же знаете интерфейс класса, который используете.
Вы свою задачу тоже решаете не встроенными средствами языка, а через Reflection, который встроенное средство платформы.
При чем тут сторонние средства?
А в чем была цель? Если вы хотели получить тестовый код, то он у вас слишком хрупкий.
Недостаток вашего кода именно в том, что все ваши ошибки будут в runtime.
Он мейнстрим там, где нет менее хрупких средств. И даже там его всячески пытаются сделать менее хрупким, jslint тому свидетельство.
С точки зрения кода тестов PerformanceProxy.Create{Of T}(instance) ничем не хуже вашего решения, но при этом еще и дает (должен дать) статическую типизацию.
За что вы так не любите сторонние средства?
Измеряем производительность с помощью DynamicObject