/// <param name="glyph">Глиф.</param> public GlyphSnapshot(AbstractGlyph glyph) { // Получаем идентификатор глифа. GlyphId = glyph.Id; // Получаем тип глифа. GlyphType = glyph.GetType().FullName; // Проходим по активным свойствам глифа и сохраняем их значения... foreach (KeyValuePair <string, string> kvp in glyph.SerializeProperties()) { AddProperty(kvp.Key, kvp.Value); } }
/// <summary> /// Задаёт свойства глифу. /// </summary> /// <param name="glyph">Свойства, которые есть в словаре, но которых не оказалось в глифе /// (например, по причине того, что в этой версии программы они были удалены).</param> /// <param name="oldValues">Использовать ли старые значения.</param> public IEnumerable <KeyValuePair <string, KeyValuePair <string, string> > > Apply(AbstractGlyph glyph, bool oldValues) { Type type = glyph.GetType(); string typeName = type.FullName; if (typeName != GlyphType) { throw new IncompatibleGlyphType(GlyphType, typeName); } // Не смотря на то, что у свойства Id сеттер приватный, // задать новое значение ему нам нужно. type.GetProperty("Id").SetValue(glyph, GlyphId, null); // Задаём свойства. foreach (KeyValuePair <string, KeyValuePair <string, string> > prop in _props) { PropertyInfo property = type.GetProperty(prop.Key); if (property == null) { yield return(prop); } else { object[] attribs = property.GetCustomAttributes(typeof(ActivePropertyAttribute), true); if (attribs.Length == 0) { yield return(prop); } else { property.SetValue(glyph, prop.Value.Value, null); } } } }