/// <summary> /// 向 <see cref="IniConfig"/> 维护的 <see cref="IObject"/> 中设置一个对象并序列化成指定节名的 <see cref="ISection"/>, 若节名已存在将会覆盖整个节 /// </summary> /// <param name="sectionKey">用作要添加的元素的键的对象</param> /// <param name="obj">用作要添加的元素的值的对象</param> /// <exception cref="ArgumentException">sectionKey 为空字符串或为 <see langword="null"/></exception> /// <exception cref="ArgumentNullException">obj 为 null</exception> public void SetObject(string sectionKey, object obj) { if (string.IsNullOrEmpty(sectionKey)) { throw new ArgumentException("sectionKey 不允许为空. 原因: obj 不能设置到为未命名的节点", "sectoinKey"); } if (obj == null) { throw new ArgumentNullException("obj"); } if (!this._object.ContainsKey(sectionKey)) // 如果不存在这个名称 { this._object.Add(new ISection(sectionKey)); } // 获取节对象 ISection section = this._object[sectionKey]; if (section.Count > 0) { section.Clear(); } Type tType = obj.GetType(); PropertyInfo[] tProperties = tType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (PropertyInfo property in tProperties) { // 获取属性是否有标记 KeyName IniKeyAttribute keyAttribute = property.GetCustomAttribute <IniKeyAttribute> (); string key = string.Empty; if (keyAttribute != null) { key = keyAttribute.KeyName; } else { key = property.Name; } // 判断 Key 重复 if (section.ContainsKey(key)) { throw new ArgumentException("序列化的对象内部存在一个或多个重复的 Key, 这个异常可能由于属性名和特性引起.", "obj"); } // 获取只有0个参数的 Get 方法 (排除索引器) MethodInfo method = property.GetGetMethod(true); if (method.GetParameters().Count() == 0) { section.Add(key, new IValue(method.Invoke(obj, null))); } } }