/// <summary> /// Gets a list of all public and private DataType fields and properties in the specified /// object that have the [FileData] attribute with the specified file version. /// </summary> /// <param name="obj">The object to get [FileData] fields from.</param> /// <param name="fileVersion">The file version to get data list from.</param> /// <returns>List of DataType objects.</returns> public static IEnumerable <DataType> GetDataList(object obj, NefsVersion fileVersion) { var props = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Where(f => f.IsDefined(typeof(FileData), false) && f.PropertyType.BaseType == typeof(DataType) && ((FileData)f.GetCustomAttribute(typeof(FileData))).FileVersions.Contains(fileVersion)) .Select(f => f.GetValue(obj) as DataType); var fields = obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Where(f => f.IsDefined(typeof(FileData), false) && f.FieldType.BaseType == typeof(DataType) && ((FileData)f.GetCustomAttribute(typeof(FileData))).FileVersions.Contains(fileVersion)) .Select(f => f.GetValue(obj) as DataType); return(props.Concat(fields)); }
/// <summary> /// Gets all DataType fields with the [FileData] attribute and reads their data from the /// file stream. /// </summary> /// <param name="file">The file stream to read from.</param> /// <param name="baseOffset">Base offset in the file.</param> /// <param name="obj">The object whose [FileData] fields to read.</param> /// <param name="fileVersion">The file version to read data for.</param> /// <param name="p">Progress info.</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> public static async Task ReadDataAsync(Stream file, UInt64 baseOffset, object obj, NefsVersion fileVersion, NefsProgress p) { foreach (var data in GetDataList(obj, fileVersion)) { await data.ReadAsync(file, baseOffset, p); } }