示例#1
0
        /// <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));
        }
示例#2
0
 /// <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);
     }
 }