/// <summary> /// Получает значение свойства объекта по ссылке на объект и имени свойства. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> /// <param name="имяПоля">Имя поля.</param> /// <param name="значение">Значение поля.</param> /// <returns>Возвращает true, Если значение установлено, в противном случае - false.</returns> public bool ПопыткаПолучитьЗначение(ОбъектСсылка ссылка, string имяПоля, out object значение) { ссылка = ссылка ?? throw new ArgumentNullException("ссылка"); if (имяПоля.Equals("Ссылка", StringComparison.OrdinalIgnoreCase)) { значение = ссылка; return(true); } УзелМетаданных реквизит; if (((dynamic)ссылка.Метаданные()).еквизиты.ПопыткаНайтиПодчиненный(имяПоля, out реквизит)) { if (ссылка.Пустая()) { значение = null; return(true); } Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); if (данныеОбъекта.TryGetValue(имяПоля, out значение)) { return(true); } this.ЗагрузитьДанныеОбъекта(ссылка); return(ПопыткаПолучитьЗначение(ссылка, имяПоля, out значение)); } if (((dynamic)ссылка.Метаданные()).ТабличныеЧасти.ПопыткаНайти(имяПоля, out реквизит)) { if (ссылка.Пустая()) { значение = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)реквизит); return(true); } Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); object таблЧасть; if (данныеОбъекта.TryGetValue(имяПоля, out таблЧасть)) { if (!(таблЧасть is ТабличнаяЧасть)) { таблЧасть = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)реквизит); данныеОбъекта[имяПоля] = таблЧасть; } значение = таблЧасть; return(true); } this.ЗагрузитьДанныеОбъекта(ссылка); return(this.ПопыткаПолучитьЗначение(ссылка, имяПоля, out значение)); } значение = null; return(false); }
internal void УстановитьЗначенияИзСвойствSOAP(ОбъектСсылка ссылка, ValueBase[] properties) { if (properties == null) { return; } УзелМетаданных реквизиты = ссылка.Метаданные().НайтиПодчиненный("Реквизиты"); УзелМетаданных таблЧасти = ссылка.Метаданные().НайтиПодчиненный("ТабличныеЧасти"); foreach (ValueBase property in properties) { УзелМетаданных текМета; if (реквизиты.ПопыткаНайтиПодчиненный(property.Name, out текМета)) { object значение = property.GetValue(this.Клиент); this.УстановитьЗначениеПоляОбъекта(ссылка, текМета.Имя(), значение); } else if (таблЧасти.ПопыткаНайтиПодчиненный(property.Name, out текМета)) { object значение = property.GetValue(this.Клиент); if (значение is ТаблицаЗначений) { ТабличнаяЧасть таблЧасть = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)текМета); таблЧасть.ЗагрузитьДанные(значение as ТаблицаЗначений); } } } }
private void ИнициализироватьДанныеОбъекта(ОбъектСсылка ссылка) { Dictionary <string, object> данныеОбъекта = ПолучитьУзелДанныхОбъекта(ссылка); данныеОбъекта.Clear(); УзелМетаданных реквизиты = ссылка.Метаданные().НайтиПодчиненный("Реквизиты"); foreach (var ключЗначение in реквизиты) { данныеОбъекта[ключЗначение.Key] = null; } данныеОбъекта["#"] = null; }