/// <summary> /// Создает ссылку на элемент перечисления. /// </summary> /// <param name="полноеИмяТипа">Полное имя типа объекта, например "Перечисление.СтавкиНДС".</param> /// <param name="указатель">Имя (идетификатор) элемента.</param> /// <param name="синоним">Синоним элемента.</param> /// <returns>Возвращает ссылку на элемент перечисления.</returns> public ПеречислениеСсылка ПолучитьПеречислениеСсылку(string полноеИмяТипа, string указатель, string синоним = "") { УзелМетаданных узелМетаданных; if (!this.Клиент.Метаданные.ПопыткаПолучить(полноеИмяТипа, out узелМетаданных)) { throw new ArgumentException(String.Format("Ошибка при получении ссылки на объект. Не удалось обнаружить объект метаданных \"{0}\".", полноеИмяТипа), "полноеИмяТипа"); } if (((МетаданныеОбъект)узелМетаданных).ТипКоллекции() != ТипКоллекции.Перечисление) { throw new Exception("Указан неверный тип коллекции."); } Guid идСсылки = КонтекстДанных.ПолучитьОбобщенныйИдентификаторСсылки(полноеИмяТипа, указатель); Ссылка ссылка = null; WeakReference <Ссылка> слабСсылка; if (this.references.TryGetValue(идСсылки, out слабСсылка) && слабСсылка.TryGetTarget(out ссылка)) { return((ПеречислениеСсылка)ссылка); } ссылка = new ПеречислениеСсылка(this.bromClient, узелМетаданных.Имя(), указатель, синоним); this.references[идСсылки] = new WeakReference <Ссылка>(ссылка); return((ПеречислениеСсылка)ссылка); }
private static Guid ПолучитьОбобщенныйИдентификаторСсылки(Ссылка ссылка) { if (ссылка is ОбъектСсылка) { ОбъектСсылка текСсылка = ссылка as ОбъектСсылка; return(ПолучитьОбобщенныйИдентификаторСсылки(текСсылка.ПолноеИмяТипа(), текСсылка.УникальныйИдентификатор().ToString())); } else { ПеречислениеСсылка текСсылка = ссылка as ПеречислениеСсылка; return(ПолучитьОбобщенныйИдентификаторСсылки(текСсылка.ПолноеИмяТипа(), текСсылка.Имя)); } }
public ValueEnumRef(ПеречислениеСсылка value) { this.Type = value != null?value.ПолноеИмяТипа() : throw new System.ArgumentNullException("value"); this.Value = value.Имя; }