Re[10]: GetValue, SetValue и EditableObject
От: BorisKV  
Дата: 25.08.11 17:44
Оценка:
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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.