В .NET 4.0 (бета) вы можете сделать это с обновленными деревьями выражений, используя Expression.Block
и Expression.Assign
- затем скомпилировать это с типизированным делегатом; работа выполнена.
В .NET 2.0 и выше (как упоминал Джон) HyperDescriptor является разумным вариантом - он работает как пользовательская реализация PropertyDescriptor
, поэтому вы просто делаете код, подобный:
// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);
Это все еще имеет небольшой бокс, но на самом деле это не узкое место.