BKV>>Можно попробовать как сдесь EditableObjectAdvanced<T>Автор: BorisKV
Дата: 28.05.10
и проперти будет репортится как измененная.
SI>Вот единственное, чего не понятно. Как повлияет на скорость такое изменение? Рефлексия вроде не используется, или ... ?
Естественно, это решение будет слегка медленнее чем без этой ручной возни, так тут есть циклы, запросы списков, и т.д, но не за счет более медленного доступа к полю. Суть этого решения в том, что как раз работает тотже код, что и был бы сгенерен BLT. Понятно что за фишки и удобства надо платить, мне кажется, что в данном случае плата разумна. Когда буду засовывать это решение в BLT я еще поиграюсь с профайлером и может чуток еще что-нибуть выжму.
Если вы посмотрите к примеру то что генерит BLT для IsDirtyMember то увидете нечто подобное (пишу по памяти — могут быть огрехи) на:
[BLToolkitGenerated] private EditableValue<int> _field1;
[BLToolkitGenerated] private static PropertyInfo _field1_$propertyInfo;
[BLToolkitGenerated] private EditableValue<string> _field2;
[BLToolkitGenerated] private static PropertyInfo _field2_$propertyInfo;
// ---- Skippped ---
[BLToolkitGenerated]
bool IMemberwiseEditable.IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
{
bool flag = false;
flag = this._field1.IsDirtyMember(_field1_$propertyInfo, memberName, ref isDirty);
if (!flag)
{
flag = this._field2.IsDirtyMember(_field2_$propertyInfo, memberName, ref isDirty);
if (!flag)
{
}
}
return flag;
}
Понятно, что такое рисовать руками никто не хочет поэтому и используется цикл. Cначала будет прогнаны сгенирированные ifы, а затем этот цикл.
public override bool IsDirtyMember(string memberName)
{
bool isDirty = base.IsDirtyMember(memberName);
if (!isDirty)
foreach (var memberwiseEditableField in GetMemberwiseEditableFields())
{
memberwiseEditableField.MemberwizeEditable.IsDirtyMember(memberwiseEditableField.PropertyInfo, memberName, ref isDirty);
if (isDirty)
break;
}
return isDirty;
}
Борис.
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>