/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションに /// コンポーネント名が含まれているか否かを取得する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <param name="componentName">コンポーネント名。</param> /// <returns>含まれているならば true 。そうでなければ false 。</returns> /// <remarks> /// 継承先での HasComponentName 静的メソッドの実装に用いることができる。 /// </remarks> protected static bool HasComponentNameCore( IniFileItemCollection items, string componentName) => items != null && componentName != null && componentName == items .FirstOrDefault(i => i.Name == ExoFileItemNameOfComponentName)? .Value;
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="name"> /// セクション名。制御文字や改行文字が含まれていてはならない。 /// </param> /// <param name="items">アイテムコレクション。</param> public IniFileSection(string name, IniFileItemCollection items) { ValidateName(name, nameof(name)); if (items == null) { throw new ArgumentNullException(nameof(items)); } this.Name = name; this.Items = items; }
/// <summary> /// オブジェクト内の ExoFileItemAttribute 属性を持つプロパティ群を /// 拡張編集オブジェクトファイルのアイテムコレクションに変換する。 /// </summary> /// <typeparam name="T">変換元オブジェクト型。</typeparam> /// <param name="source">変換元オブジェクト。</param> /// <returns>アイテムコレクション。</returns> public static IniFileItemCollection ToItems <T>(T source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } var items = new IniFileItemCollection(); // 対象プロパティ情報列挙を取得 var props = source.GetType() .GetProperties( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Select( info => new { info, attr = info.GetCustomAttribute <ExoFileItemAttribute>(true), }) .Where(v => v.info.CanRead && v.attr != null) .OrderBy(v => v.attr.Order); foreach (var p in props) { // プロパティ値取得 var value = p.info.GetMethod.Invoke(source, null); // コンバータ取得 var conv = GetItemConverter(p.attr.ConverterType); // プロパティ値をアイテム文字列値に変換 var exoValue = conv.ToExoFileValue(value, p.info.PropertyType); if (exoValue == null) { throw new InvalidCastException( @"Cannot convert from the property (" + p.info.Name + @") of " + source.GetType().Name + @"."); } // セクションに追加 items.Add(p.attr.Name, exoValue); } return(items); }
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>コンポーネント。</returns> public static IComponent FromExoFileItems(IniFileItemCollection items) { if (items == null) { throw new ArgumentNullException(nameof(items)); } var result = Methods .Select(m => m.CanMake(items) ? m.Make(items) : null) .FirstOrDefault(c => c != null); if (result == null) { throw new InvalidCastException(@"Cannot make a component."); } return result; }
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>コンポーネント。</returns> public static IComponent FromExoFileItems(IniFileItemCollection items) { if (items == null) { throw new ArgumentNullException(nameof(items)); } var result = Methods .Select(m => m.CanMake(items) ? m.Make(items) : null) .FirstOrDefault(c => c != null); if (result == null) { throw new InvalidCastException(@"Cannot make a component."); } return(result); }
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <typeparam name="T">コンポーネント型。</typeparam> /// <param name="items">アイテムコレクション。</param> /// <param name="creater">コンポーネント生成デリゲート。</param> /// <returns>コンポーネント。</returns> /// <remarks> /// 継承先での FromExoFileItems 静的メソッドの実装に用いることができる。 /// </remarks> protected static T FromExoFileItemsCore <T>( IniFileItemCollection items, Func <T> creater) where T : ComponentBase { if (creater == null) { throw new ArgumentNullException(nameof(creater)); } // コンポーネント生成 var result = creater(); if (result == null) { throw new ArgumentException( @"Cannot create the component.", nameof(creater)); } if (items == null) { throw new ArgumentNullException(nameof(items)); } // コンポーネント名をチェック if (!HasComponentNameCore(items, result.ComponentName)) { throw new ArgumentException( @"The component name is not found.", nameof(items)); } // プロパティ群設定 ExoFileItemsConverter.ToProperties(items, ref result); return(result); }
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>コンポーネント。</returns> public static TextComponent FromExoFileItems(IniFileItemCollection items) => FromExoFileItemsCore(items, () => new TextComponent());
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションに /// コンポーネント名が含まれているか否かを取得する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>含まれているならば true 。そうでなければ false 。</returns> public static bool HasComponentName(IniFileItemCollection items) => HasComponentNameCore(items, ThisComponentName);
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>コンポーネント。</returns> public static AudioFileComponent FromExoFileItems(IniFileItemCollection items) => FromExoFileItemsCore(items, () => new AudioFileComponent());
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションから /// コンポーネントを作成する。 /// </summary> /// <param name="items">アイテムコレクション。</param> /// <returns>コンポーネント。</returns> public static RenderComponent FromExoFileItems(IniFileItemCollection items) => FromExoFileItemsCore(items, () => new RenderComponent());
/// <summary> /// 拡張編集オブジェクトファイルのアイテムコレクションの内容を変換し、 /// オブジェクト内の ExoFileItemAttribute 属性を持つプロパティ群に設定する。 /// </summary> /// <typeparam name="T">設定先オブジェクト型。</typeparam> /// <param name="items">アイテムコレクション。</param> /// <param name="target">設定先オブジェクト。</param> /// <returns>設定したアイテム数。</returns> public static int ToProperties <T>(IniFileItemCollection items, ref T target) { if (items == null) { throw new ArgumentNullException(nameof(items)); } if (target == null) { throw new ArgumentNullException(nameof(target)); } // 対象プロパティ情報列挙を取得 var props = target.GetType() .GetProperties( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Select( info => new { info, attr = info.GetCustomAttribute <ExoFileItemAttribute>(true), }) .Where(v => v.info.CanWrite && v.attr != null); int count = 0; foreach (var p in props) { // アイテム文字列値取得 var exoValue = items.FirstOrDefault(i => i.Name == p.attr.Name)?.Value; if (exoValue == null) { // 存在しないアイテムは無視 continue; } // コンバータ取得 var conv = GetItemConverter(p.attr.ConverterType); // アイテム文字列値をプロパティ値に変換 var value = conv.FromExoFileValue(exoValue, p.info.PropertyType); if (value == null) { throw new InvalidCastException( @"Cannot convert to the property (" + p.info.Name + @") of " + target.GetType().Name + @"."); } // プロパティ値設定 p.info.SetMethod.Invoke(target, new[] { value.Item1 }); ++count; } return(count); }
private void OnDeserializing(StreamingContext context) { this.Name = ""; this.Items = new IniFileItemCollection(); }