macad.commom解析fileio,framework

2024-02-20 04:28

本文主要是介绍macad.commom解析fileio,framework,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1fileio

using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using Macad.Common.Serialization;namespace Macad.Common
{// 定义一个名为 FileSystem 的 sealed 类// 实现了 IDisposable 接口,用于处理文件系统相关操作public sealed class FileSystem : IDisposable{#region Properties// 获取文件系统的路径public string Path { get; }//--------------------------------------------------------------------------------------------------// 获取临时路径(在路径后加上“.tmp”)string _TempPath => Path + ".tmp";//--------------------------------------------------------------------------------------------------#endregion#region Construction and Destruction// 构造函数,初始化 FileSystem 类的实例public FileSystem(string path){Path = path;}//--------------------------------------------------------------------------------------------------// 析构函数,用于释放资源~FileSystem(){Dispose(false);}//--------------------------------------------------------------------------------------------------#endregion#region IDisposable// 释放资源的方法void Dispose(bool disposing){bool delTemp = _Archive?.Mode == ZipArchiveMode.Create;if (disposing){_Archive?.Dispose();}_Archive = null;if (delTemp){// 删除临时文件File.Delete(_TempPath);}}//--------------------------------------------------------------------------------------------------// 实现 IDisposable 接口的 Dispose 方法public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}//--------------------------------------------------------------------------------------------------#endregion#region Public API// 写入文件流到压缩文件中的指定路径public bool Write(string name, MemoryStream memStream){try{_OpenForWriting();// 检查是否已存在指定路径的条目var entry = _Archive.GetEntry(name);entry?.Delete();entry = _Archive.CreateEntry(name);using var entryStream = entry.Open();// 将内存流复制到压缩文件中的指定条目中memStream.Position = 0;memStream.CopyTo(entryStream);entryStream.Flush();entryStream.Close();return true;}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while writing file {name} to archive {Path}. ({e.Message})");}}//--------------------------------------------------------------------------------------------------// 写入字节数组到压缩文件中的指定路径public bool Write(string name, byte[] buffer){try{_OpenForWriting();var entry = _Archive.CreateEntry(name);using var entryStream = entry.Open();// 将字节数组写入压缩文件中的指定条目中entryStream.Write(buffer, 0, buffer.Length);entryStream.Flush();entryStream.Close();return true;}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while writing file {name} to archive {Path}. ({e.Message})");}}//--------------------------------------------------------------------------------------------------// 从压缩文件中读取指定路径的文件内容为字节数组public byte[] Read(string name){try{_OpenForReading(Path);var entry = _Archive.GetEntry(name);if (entry == null)return null;using var instream = entry.Open();int length = (int)entry.Length;byte[] buffer = new byte[length];int totalRead = 0;while (totalRead < length){var bytesRead = instream.Read(buffer, totalRead, length-totalRead);if (bytesRead == 0){throw new Exception("Less bytes read than expected.");}totalRead += bytesRead;}return buffer;}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while reading file {name} from archive {Path}. ({e.Message})");}}//--------------------------------------------------------------------------------------------------// 提交对压缩文件的修改public void Commit(){if (_Archive != null){_Archive.Dispose();_Archive = null;// 复制临时文件到目标路径,然后删除临时文件File.Copy(_TempPath, Path, true);File.Delete(_TempPath);}}//--------------------------------------------------------------------------------------------------// 从压缩文件中移除指定路径的文件public void Remove(string name){try{_OpenForWriting();if (name.EndsWith("*")){// 移除多个文件var maskstring = name.Substring(0, name.Length - 1);var entries = _Archive.Entries.Where(e => e.FullName.StartsWith(maskstring)).ToArray();foreach (var entry in entries){entry.Delete();}}else{// 移除单个文件var entry = _Archive.GetEntry(name);entry?.Delete();}}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while writing file {name} to archive {Path}. ({e.Message})");}}//--------------------------------------------------------------------------------------------------#endregion#region Serialization// 从压缩文件中反序列化指定路径的文件内容为对象public T Deserialize<T>(string name, SerializationContext context, Func<Version, bool> verifyVersion) where T : class{try{_OpenForReading(Path);var entry = _Archive.GetEntry(name);if (entry == null)return null;using var streamReader = new StreamReader(entry.Open(), Encoding.UTF8);var reader = new Reader(streamReader.ReadToEnd());var doc = Serializer.Deserialize<DocumentHeader>(reader, context);Debug.Assert(doc.ContentType == typeof(T).Name);context.Version = new Version(doc.MajorVersion, doc.MinorVersion);if (!(verifyVersion?.Invoke(context.Version) ?? true)){context.Result = SerializationResult.VersionMismatch;return null;}context.BlobArchive = new FileSystemBlobArchive(this, name);var instance = Serializer.Deserialize<T>(reader, context);context.BlobArchive = null;return instance;}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while reading file {name} from archive {Path}. ({e.Message})");}}//--------------------------------------------------------------------------------------------------// 将对象序列化并写入压缩文件的指定路径public bool Serialize(string name, object instance, SerializationContext context){try{context.BlobArchive = new FileSystemBlobArchive(this, name);var document = new DocumentHeader(){ContentType = instance.GetType().Name,MajorVersion = context.Version.Major,MinorVersion = context.Version.Minor};var writer = new Writer();if (!Serializer.Serialize(writer, document, context)|| !Serializer.Serialize(writer, instance, context))return false;var s = Serializer.Format(writer.ToString());if (s.IsNullOrEmpty())return false;if (Write(name, s.ToUtf8Bytes())){return true;}}catch (Exception e){Console.WriteLine(e);throw new Exception($"Error while serializing file {name} of type {instance.GetType().FullName}. ({e.Message})");}return false;}//--------------------------------------------------------------------------------------------------#endregion#region Private stuffZipArchive _Archive;//--------------------------------------------------------------------------------------------------// 打开压缩文件以便写入内容void _OpenForWriting(){Debug.Assert(_Archive?.Mode != ZipArchiveMode.Read);if (_Archive != null) return;Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Path));if (File.Exists(_TempPath)){File.Delete(_TempPath);}_Archive = ZipFile.Open(_TempPath, ZipArchiveMode.Create);}//--------------------------------------------------------------------------------------------------// 打开压缩文件以便读取内容void _OpenForReading(string path){Debug.Assert(_Archive?.Mode != ZipArchiveMode.Create);_Archive ??= ZipFile.Open(path, ZipArchiveMode.Read);}//--------------------------------------------------------------------------------------------------#endregion}
}

这段代码实现了一个用于操作文件系统的类 FileSystem,提供了一系列用于读取、写入、删除和序列化文件的方法。其中,文件被存储在压缩文件中,类内部使用 ZipArchive 对象来进行压缩文件的操作。

2.

namespace Macad.Common
{// 定义了一个用于文件系统的 Blob 存储的类 FileSystemBlobArchive// 实现了 IBlobArchive 接口,用于处理 Blob 数据的读写操作public sealed class FileSystemBlobArchive : Serialization.IBlobArchive{// 文件系统对象readonly FileSystem _FileSystem;// Blob 存储的基本路径readonly string _BaseName;// 最后一个 Blob 的编号int _LastId = -1;// 构造函数,初始化 FileSystemBlobArchive 类的实例public FileSystemBlobArchive(FileSystem fileSystem, string baseName){_FileSystem = fileSystem;_BaseName = baseName;}// 写入 Blob 数据并返回 Blob 的编号public int WriteBlob(byte[] data){_LastId++;// 构建 Blob 存储的路径var path = $"Blobs\\{_BaseName}\\{_LastId:x8}";// 调用文件系统对象的 Write 方法写入数据到指定路径if (!_FileSystem.Write(path, data))return -1;return _LastId;}// 根据 Blob 的编号读取对应的 Blob 数据public byte[] ReadBlob(int reference){// 构建 Blob 存储的路径var path = $"Blobs\\{_BaseName}\\{reference:x8}";// 调用文件系统对象的 Read 方法读取指定路径的数据并返回return _FileSystem.Read(path);}}
}

这段代码定义了一个用于文件系统的 Blob 存储的类 FileSystemBlobArchive,实现了 IBlobArchive 接口,用于处理 Blob 数据的读写操作。通过该类,可以将 Blob 数据写入文件系统并根据编号读取对应的 Blob 数据。

3.framework

using System;namespace Macad.Common
{// 定义了一个泛型 LimitedStack 类,用于实现有限长度的栈数据结构public class LimitedStack<T>{readonly T[] _Items; // 用于存储栈元素的数组uint _Head; // 指示栈顶元素位置的索引uint _Trail; // 指示栈中元素数量的计数器//--------------------------------------------------------------------------------------------------// 获取栈中元素的数量public uint Count{get { return _Trail; }}//--------------------------------------------------------------------------------------------------// LimitedStack 类的构造函数,接受一个参数表示栈的最大长度public LimitedStack(uint length){_Items = new T[length]; // 初始化栈元素数组_Head = 0; // 初始化栈顶元素位置索引_Trail = 0; // 初始化栈中元素数量计数器}//--------------------------------------------------------------------------------------------------// 将元素压入栈中public void Push(T element){// 如果栈未满,则增加栈中元素数量if (_Trail < _Items.Length){_Trail++;}// 将新元素放入栈顶,并更新栈顶位置索引_Items[_Head] = element;_Head++;// 如果栈顶位置索引超出数组长度,则将其置为 0,实现循环栈if (_Head >= _Items.Length){_Head = 0;}}//--------------------------------------------------------------------------------------------------// 从栈中弹出元素public T Pop(){// 如果栈为空,则返回默认值if (_Trail == 0)return default(T);// 更新栈顶位置索引if (_Head == 0){_Head = (uint)_Items.Length;}_Head--;// 获取栈顶元素,并更新栈中元素数量计数器T element = _Items[_Head];_Trail--;return element;}//--------------------------------------------------------------------------------------------------// 清空栈中的所有元素public void Clear(){_Trail = 0; // 将栈中元素数量计数器置为 0Array.Clear(_Items, 0, _Items.Length); // 清空栈元素数组}}
}

这段代码定义了一个有限长度的栈数据结构 LimitedStack<T>,其中:

  • 构造函数 LimitedStack(uint length) 用于初始化栈的最大长度,并创建存储栈元素的数组 _Items
  • 属性 Count 用于获取栈中元素的数量。
  • 方法 Push(T element) 用于将元素压入栈中。
  • 方法 Pop() 用于从栈中弹出元素。
  • 方法 Clear() 用于清空栈中的所有元素。

4.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Dynamic;
using System.Reflection;
using System.Runtime.CompilerServices;
using Macad.Common.Serialization;namespace Macad.Common
{// 定义了一个可序列化的基类 OverridableParameterSet,用于管理具有默认值和可重写值的参数集合[SerializeType]public class OverridableParameterSet : ISerializeValue{// 指示是否存在重写参数的属性public bool HasOverriddenParameters{get { return _OverriddenValues.Count > 0; }}//--------------------------------------------------------------------------------------------------// 定义参数值变更事件的委托类型public delegate void ParameterChangedEventHandler(OverridableParameterSet parameterSet, string parameterKey);//--------------------------------------------------------------------------------------------------// 定义参数值变更事件public static event ParameterChangedEventHandler ParameterChanged;// 引发参数值变更事件protected void RaiseParameterChanged(string key){ParameterChanged?.Invoke(this, key);}//--------------------------------------------------------------------------------------------------// 根据参数名获取参数值protected T GetValue<T>([CallerMemberName] string key = null){Debug.Assert(key != null);object value;// 如果参数被重写,则返回重写的值;否则返回默认值if (_OverriddenValues.TryGetValue(key, out value))return (T)value;if (_DefaultValues.TryGetValue(key, out value))return (T)value;Debug.Assert(true, $"Value {key} of type {typeof(T).Name} has no default value.");return default(T);}//--------------------------------------------------------------------------------------------------// 设置参数的默认值protected void SetDefaultValue<T>(string key, T value){Debug.Assert(key != null);_DefaultValues[key] = value;}//--------------------------------------------------------------------------------------------------// 设置参数的值,并引发参数值变更事件protected void SetValue<T>(T value, [CallerMemberName] string key = null){Debug.Assert(key != null);_OverriddenValues[key] = value;RaiseParameterChanged(key);}//--------------------------------------------------------------------------------------------------// 重置参数的值为默认值public void ResetValue(string key){Debug.Assert(key != null);_OverriddenValues.Remove(key);RaiseParameterChanged(key);}//--------------------------------------------------------------------------------------------------// 保存参数的重写值的字典Dictionary<string, object> _OverriddenValues = new Dictionary<string, object>();// 保存参数的默认值的字典readonly Dictionary<string, object> _DefaultValues = new Dictionary<string, object>();//--------------------------------------------------------------------------------------------------// 将对象序列化为 Writerpublic bool Write(Writer writer, SerializationContext context){writer.BeginMap();// 将重写的参数写入 Writerforeach (var valueKvp in _OverriddenValues){writer.BeginMapKey();writer.WriteValueString(valueKvp.Key);writer.BeginMapValue();writer.WriteType(valueKvp.Value, context);}writer.EndMap();return true;}//--------------------------------------------------------------------------------------------------// 将对象从 Reader 中反序列化public bool Read(Reader reader, SerializationContext context){if (!reader.BeginMap())return false;while (reader.BeginMapKey()){var key = reader.ReadValueString();if (!reader.BeginMapValue())return false;// 尝试查找默认值if (!_DefaultValues.TryGetValue(key, out var defaultValue)){reader.SkipListOrMapValue();continue;}var serializer = Serializer.GetSerializer(defaultValue.GetType());if (serializer == null){reader.SkipListOrMapValue();continue;}var newValue = serializer.Read(reader, null, context);reader.EatWhiteSpaces();if (newValue != null){_OverriddenValues[key] = newValue;}}reader.EndMap();return true;}//--------------------------------------------------------------------------------------------------// 保护的构造函数,只允许派生类内部访问protected OverridableParameterSet(){ }}//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------------------// 定义了一个参数集合类 ParameterSets,用于管理多个参数集合对象[SerializeType]public class ParameterSets : ISerializeValue{// 根据类型获取参数集合对象public T Get<T>() where T: OverridableParameterSet{if (_ParameterSets.TryGetValue(typeof(T), out var set))return set as T;var newSet = Activator.CreateInstance<T>();Add(newSet);return newSet;}//--------------------------------------------------------------------------------------------------// 添加参数集合对象public void Add<T>(T newSet) where T: OverridableParameterSet{_ParameterSets[typeof(T)] = newSet;}//--------------------------------------------------------------------------------------------------// 保存参数集合对象的字典Dictionary<Type, OverridableParameterSet> _ParameterSets = new Dictionary<Type, OverridableParameterSet>();//--------------------------------------------------------------------------------------------------// 将对象序列化为 Writerpublic bool Write(Writer writer, SerializationContext context){writer.BeginMap();foreach (var setKvp in _ParameterSets){// 只将具有重写参数的参数集合对象写入 Writerif (!setKvp.Value.HasOverriddenParameters)continue;writer.BeginMapKey();writer.WriteValueString(Serializer.ApplyNamespaceAlias(setKvp.Key.FullName));writer.BeginMapValue();writer.WriteType(setKvp.Value, context);}writer.EndMap();return true;}//--------------------------------------------------------------------------------------------------// 将对象从 Reader 中反序列化public bool Read(Reader reader, SerializationContext context){_ParameterSets.Clear();if (!reader.BeginMap())return false;while (reader.BeginMapKey()){string key = reader.ReadValueString();if (key.IsNullOrEmpty())return false;var serializer = Serializer.GetSerializer(key);if (serializer == null){reader.SkipListOrMapValue();continue;}if (!reader.BeginMapValue())return false;var newSet = serializer.Read(reader, null, context) as OverridableParameterSet;if (newSet == null){continue;}_ParameterSets.Add(newSet.GetType(), newSet);}return reader.EndMap();}//--------------------------------------------------------------------------------------------------}
}

这段代码定义了两个类:

  1. OverridableParameterSet: 该类表示可重写参数集合,其中包括:

    • HasOverriddenParameters 属性用于指示是否存在重写参数。
    • ParameterChanged 事件用于在参数值发生变化时通知监听者。
    • GetValue<T> 方法用于获取参数值。
    • SetDefaultValue<T> 方法用于设置参数的默认值。
    • SetValue<T> 方法用于设置参数的值,并触发参数值变化事件。
    • ResetValue 方法用于重置参数值为默认值。
    • Write 方法用于将对象序列化为 Writer。
    • Read 方法用于从 Reader 中反序列化对象。
    • _OverriddenValues 字典保存了重写的参数值。
    • _DefaultValues 字典保存了参数的默认值。
  2. ParameterSets: 该类用于管理多个参数集合对象,其中包括:

    • Get<T> 方法用于根据类型获取参数集合对象。
    • Add<T> 方法用于添加参数集合对象。
    • Write 方法用于将对象序列化为 Writer。
    • Read 方法用于从 Reader 中反序列化对象。
    • _ParameterSets 字典保存了参数集合对象。

这两个类都实现了 ISerializeValue 接口,支持对象的序列化和反序列化操作。

5.

using System.Runtime.CompilerServices;namespace Macad.Common
{// 定义了一个泛型类 WeakTable<TKey, TValue>,用于实现弱引用的键值对集合public class WeakTable<TKey,TValue> where TKey : class where TValue : class{// 索引器,用于获取和设置键对应的值public TValue this[TKey key]{get { return GetValue(key); }set { SetValue(key, value); }}//--------------------------------------------------------------------------------------------------// 存储空键对应的值TValue _NullValue;// 使用 ConditionalWeakTable<TKey, TValue> 实现键值对集合readonly ConditionalWeakTable<TKey, TValue> _Table = new ConditionalWeakTable<TKey, TValue>();//--------------------------------------------------------------------------------------------------// 检查是否存在指定键的值public bool HasValue(TKey key){// 如果键为空,则检查空键对应的值是否为空if (key == null)return _NullValue != null;// 否则,使用 ConditionalWeakTable 来检查键值对是否存在return _Table.TryGetValue(key, out var _);}//--------------------------------------------------------------------------------------------------// 获取指定键的值public TValue GetValue(TKey key){// 如果键为空,则返回空键对应的值if (key == null)return _NullValue;// 否则,使用 ConditionalWeakTable 获取键对应的值if (_Table.TryGetValue(key, out var value))return value;// 如果不存在键对应的值,则返回 nullreturn null;}//--------------------------------------------------------------------------------------------------// 尝试获取指定键的值public bool TryGetValue(TKey key, out TValue value){// 如果键为空,则返回空键对应的值if (key == null){value = _NullValue;return value != null;}// 否则,使用 ConditionalWeakTable 尝试获取键对应的值return _Table.TryGetValue(key, out value);}//--------------------------------------------------------------------------------------------------// 设置指定键的值public void SetValue(TKey key, TValue value){// 如果键为空,则设置空键对应的值if (key == null){_NullValue = value;}// 否则,移除键对应的值并添加新的键值对else{_Table.Remove(key);if(value != null)_Table.Add(key, value);}}//--------------------------------------------------------------------------------------------------// 移除指定键对应的值public void Remove(TKey key){if (key != null){_Table.Remove(key);}}//--------------------------------------------------------------------------------------------------}
}

这段代码定义了一个名为 WeakTable<TKey, TValue> 的泛型类,用于实现弱引用的键值对集合。主要包括以下功能:

  • 使用 ConditionalWeakTable<TKey, TValue> 来存储键值对,其中 TKey 必须是类类型,而 TValue 可以是任意类型。
  • 提供索引器 this[TKey key] 用于获取和设置键对应的值。
  • 提供方法 HasValue 用于检查是否存在指定键的值,以及 GetValue 方法用于获取指定键的值。
  • 提供方法 TryGetValue 用于尝试获取指定键的值。
  • 提供方法 SetValue 用于设置指定键的值,如果键为空,则设置空键对应的值。
  • 提供方法 Remove 用于移除指定键对应的值。

6.extentions

using System;
using System.Runtime.CompilerServices;namespace Macad.Common
{// 定义了一个静态类 ArrayExtensions,用于提供数组的扩展方法public static class ArrayExtensions{// 扩展方法 Fill,用于将数组的所有元素填充为指定的值public static void Fill<T>(this T[] array, T value){// 遍历数组,并将每个元素设置为指定的值for (int i = 0; i < array.Length; i++){array[i] = value;}}//--------------------------------------------------------------------------------------------------// 扩展方法 Fill,用于将数组的指定范围内的元素填充为指定的值public static void Fill<T>(this T[] array, int start, int length, T value){// 根据指定的起始位置和长度,遍历数组,并将指定范围内的元素设置为指定的值for (int i = start; i < start+length; i++){array[i] = value;}}//--------------------------------------------------------------------------------------------------// 扩展方法 ForEach,用于对数组的每个元素执行指定的操作public static void ForEach<T>(this T[] array, Action<T> action){// 遍历数组,并对每个元素执行指定的操作for (int index = 0; index < array.Length; ++index){action(array[index]);}}}
}

这段代码定义了一个名为 ArrayExtensions 的静态类,其中包含了三个数组的扩展方法:

  1. Fill<T>(this T[] array, T value):将数组的所有元素填充为指定的值。
  2. Fill<T>(this T[] array, int start, int length, T value):将数组的指定范围内的元素填充为指定的值。
  3. ForEach<T>(this T[] array, Action<T> action):对数组的每个元素执行指定的操作。

7.

using System;
using System.Globalization;namespace Macad.Common
{// 定义了一个静态类 DoubleExtensions,用于提供 double 类型的扩展方法public static class DoubleExtensions{// 扩展方法 ToDeg,用于将弧度转换为角度public static double ToDeg(this double rad){return rad * Maths.DegRadMultiplier;}// 扩展方法 ToRad,用于将角度转换为弧度public static double ToRad(this double deg){return deg / Maths.DegRadMultiplier;}// 扩展方法 IsNull,用于判断 double 类型的值是否接近于零public static bool IsNull(this double value){return Math.Abs(value) <= Double.Epsilon;}// 扩展方法 Clamp,用于将 double 类型的值限制在指定的范围内public static double Clamp(this double value, double min, double max){return Math.Min(max, Math.Max(min, value));}// 扩展方法 Round,用于对 double 类型的值进行四舍五入public static double Round(this double value){return Math.Round(value, Maths.Precision);}// 扩展方法 ToRoundedInt,用于将 double 类型的值进行四舍五入后转换为整数public static int ToRoundedInt(this double value){return (int)Math.Round(value, MidpointRounding.AwayFromZero);}// 扩展方法 Abs,用于返回 double 类型的值的绝对值public static double Abs(this double value){return Math.Abs(value);}// 扩展方法 Sqr,用于返回 double 类型的值的平方public static double Sqr(this double value){return value * value;}// 扩展方法 Sqrt,用于返回 double 类型的值的平方根public static double Sqrt(this double value){return Math.Sqrt(value);}// 扩展方法 ToInvariantString,用于将 double 类型的值转换为不受区域设置影响的字符串表示形式public static string ToInvariantString(this double value, string format = "G"){return value.ToString(format, CultureInfo.InvariantCulture);}// 扩展方法 ToRoundedString,用于将 double 类型的值四舍五入并转换为字符串表示形式public static string ToRoundedString(this double value){return value.ToString(Maths.PrecisionFormatString, CultureInfo.InvariantCulture);}// 扩展方法 IsEqual,用于比较两个 double 类型的值是否相等,考虑指定的容差public static bool IsEqual(this double value, double other, double tolerance){double val = value - other;if (val < 0) val = -val;return (val <= tolerance);}// 扩展方法 Distance,用于计算两个 double 类型的值之间的距离public static double Distance(this double value, double other){double val = value - other;if (val < 0) val = -val;return val;}// 扩展方法 Lerp,用于在两个 double 类型的值之间执行线性插值public static double Lerp(this double value, double other, double amount){return value * (1.0 - amount) + other * amount;}// 扩展方法 Swap,用于交换两个 double 类型的值public static void Swap(this ref double value, ref double other){double temp = value;value = other;other = temp;}}
}

这段代码定义了一个静态类 DoubleExtensions,其中包含了一系列针对 double 类型的扩展方法,用于进行各种数学运算、转换和格式化操作。

8.

using System;namespace Macad.Common
{// 定义了一个静态类 EnumExtensions,用于提供枚举类型的扩展方法public static class EnumExtensions{// 扩展方法 Has,用于检查枚举值是否包含特定的枚举成员public static bool Has<T>(this System.Enum type, T value){try{return (((int)(object)type & (int)(object)value) == (int)(object)value);}catch{return false;}}// 扩展方法 Has,用于检查枚举值是否包含特定名称的枚举成员public static bool Has<T>(this System.Enum type, string value){try{var ev = Enum.Parse(type.GetType(), value);return (((int)(object)type & (int)(object)value) == (int)(object)ev);}catch{return false;}}// 扩展方法 Is,用于检查枚举值是否等于特定的枚举成员public static bool Is<T>(this System.Enum type, T value){try{return (int)(object)type == (int)(object)value;}catch{return false;}}// 扩展方法 Added,用于将特定的枚举成员添加到枚举值中public static T Added<T>(this System.Enum type, T value){try{return (T)(object)(((int)(object)type | (int)(object)value));}catch (Exception ex){throw new ArgumentException(string.Format("Could not append value from enumerated type '{0}'.",typeof(T).Name), ex);}}// 扩展方法 Removed,用于从枚举值中移除特定的枚举成员public static T Removed<T>(this System.Enum type, T value){try{return (T)(object)(((int)(object)type & ~(int)(object)value));}catch (Exception ex){throw new ArgumentException(string.Format("Could not remove value from enumerated type '{0}'.",typeof(T).Name), ex);}}// 扩展方法 Toggled,用于切换枚举值中特定枚举成员的状态(存在则移除,不存在则添加)public static T Toggled<T>(this System.Enum type, T value){try{var it = (int)(object)type;var iv = (int)(object)value;if ((it & iv) > 0)return (T)(object)(it & ~iv);elsereturn (T)(object)(it | iv);}catch (Exception ex){throw new ArgumentException(string.Format("Could not append value from enumerated type '{0}'.",typeof(T).Name), ex);}}}
}

这段代码定义了一个静态类 EnumExtensions,其中包含了一系列针对枚举类型的扩展方法,用于进行各种枚举值的操作,包括检查是否包含特定成员、添加、移除和切换成员等。

9.还有两个float和int的静态类的代码未作注释

10.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;namespace Macad.Common
{// 定义了一个静态类 LinqExtensions,用于提供 LINQ 操作的扩展方法public static class LinqExtensions{// 扩展方法 ContainsAll,用于检查当前集合是否包含另一个集合的所有元素public static bool ContainsAll<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> other){if (source == null) throw new ArgumentNullException(nameof(source));if (other == null) throw new ArgumentNullException(nameof(other));var sources = source.ToList();using (var otherIterator = other.GetEnumerator()){while (otherIterator.MoveNext()){var candidate = otherIterator.Current;if (!sources.Contains(candidate)){return false;}}return true;}}// 扩展方法 ContainsAny,用于检查当前集合是否包含另一个集合的任何一个元素public static bool ContainsAny<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> other){if (source == null) throw new ArgumentNullException(nameof(source));if (other == null) throw new ArgumentNullException(nameof(other));var sources = source.ToList();using (var otherIterator = other.GetEnumerator()){while (otherIterator.MoveNext()){var candidate = otherIterator.Current;if (sources.Contains(candidate)){return true;}}return false;}}// 扩展方法 ToIndexedDictionary,将当前集合转换为以索引为键的字典public static Dictionary<int, TSource> ToIndexedDictionary<TSource>(this IEnumerable<TSource> source) {if (source == null) throw new ArgumentNullException(nameof(source));var dict = new Dictionary<int, TSource>();int index = 0;foreach (TSource element in source){dict.Add(index, element);index++;}return dict;}// 扩展方法 SymmetricExcept,返回两个集合的对称差集public static IEnumerable<TSource> SymmetricExcept<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> other){HashSet<TSource> hashSet = new HashSet<TSource>(source);hashSet.SymmetricExceptWith(other);return hashSet.Select(x => x);}// 扩展方法 ForEach,对集合中的每个元素执行指定的操作public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action) {if (source == null) throw new ArgumentNullException(nameof(source));if (action == null) throw new ArgumentNullException(nameof(action));foreach (var item in source){action(item);}}}
}

这段代码定义了一个静态类 LinqExtensions,其中包含了一系列针对 LINQ 操作的扩展方法,用于对集合进行常见的操作,包括检查是否包含所有元素、任何一个元素、转换为索引字典、计算对称差集以及对集合中的每个元素执行操作。

11.

using System;
using System.Collections.Generic;namespace Macad.Common
{// 定义了一个静态类 ListExtensions,用于提供列表操作的扩展方法public static class ListExtensions{// 扩展方法 Swap,用于交换列表中两个索引位置的元素public static void Swap<T>(this IList<T> list, int index1, int index2){T tmp = list[index1];list[index1] = list[index2];list[index2] = tmp;}// 扩展方法 IndexOfFirst,用于在列表中查找满足条件的第一个元素的索引public static int IndexOfFirst<T>(this IList<T> list, Func<T, bool> predicate){if (list == null)throw new ArgumentNullException(nameof(list));if (predicate == null)throw new ArgumentNullException(nameof(predicate));for (int index=0; index < list.Count; ++index){if (predicate(list[index]))return index;}return -1;}// 扩展方法 Populate,用于将列表中所有元素设置为指定值public static void Populate<T>(this IList<T> list, T value ) {for (int i = 0; i < list.Count; ++i){list[i] = value;}}}
}

这段代码定义了一个静态类 ListExtensions,其中包含了一系列针对列表操作的扩展方法,用于对列表进行常见的操作,包括交换元素、查找满足条件的第一个元素的索引以及将列表中所有元素设置为指定值。

12.

using System.Collections.Generic;namespace Macad.Common
{// 定义了一个静态类 QueueExtensions,用于扩展 Queue<T> 类型的功能public static class QueueExtensions{// 定义了一个扩展方法 EnqueueMany,用于将一个 IEnumerable<T> 集合中的元素依次添加到队列中public static void EnqueueMany<T>(this Queue<T> queue, IEnumerable<T> items){// 遍历 items 中的每个元素foreach (var item in items){// 将当前元素添加到队列中queue.Enqueue(item);}}}
}

整段代码的作用是为 Queue<T> 类型添加一个扩展方法 EnqueueMany,使得可以将一个 IEnumerable<T> 集合中的所有元素依次添加到队列中。

13.

using System.Collections.Generic;namespace Macad.Common
{// 定义了一个静态类 StackExtensions,用于扩展 Stack<T> 类型的功能public static class StackExtensions{// 定义了一个扩展方法 PushMany,用于将一个 IEnumerable<T> 集合中的元素依次压入栈中public static void PushMany<T>(this Stack<T> stack, IEnumerable<T> items){// 遍历 items 中的每个元素foreach (var item in items){// 将当前元素压入栈中stack.Push(item);}}}
}

整段代码的作用是为 Stack<T> 类型添加一个扩展方法 PushMany,使得可以将一个 IEnumerable<T> 集合中的所有元素依次压入栈中。

14.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;namespace Macad.Common
{// 定义了一个静态类 StringExtensions,用于扩展 string 类型的功能public static class StringExtensions{// 将字符串转换为混合大小写形式,即交替大小写public static string ToMixedCase(this string value){// 如果字符串为空或者为null,则直接返回if (string.IsNullOrEmpty(value)) return value;var len = value.Length;var newValue = new char[len];var ToUpperCase = true;for (var i = 0; i < len; ++i){var c0 = value[i];// 如果字符不是字母,则直接赋值,并设置下一个字符为大写if (!Char.IsLetter(c0)){newValue[i] = c0;ToUpperCase = true;continue;}var c0isUpper = Char.IsUpper(c0);// 如果当前字符是大写,并且下一个字符不应该大写,则转换为小写if (c0isUpper && !ToUpperCase){c0 = Char.ToLower(c0);}// 如果当前字符是小写,并且下一个字符应该大写,则转换为大写else if (!c0isUpper && ToUpperCase){c0 = Char.ToUpper(c0);}newValue[i] = c0;ToUpperCase = false;}return new string(newValue);}//--------------------------------------------------------------------------------------------------// 检查字符串是否为 null 或空白字符串public static bool IsNullOrWhiteSpace(this string value){return String.IsNullOrWhiteSpace(value);}//--------------------------------------------------------------------------------------------------// 检查字符串是否为空字符串public static bool IsEmpty(this string value){return String.IsNullOrEmpty(value);}//--------------------------------------------------------------------------------------------------// 检查字符串是否为 null 或空字符串public static bool IsNullOrEmpty(this string value){return String.IsNullOrEmpty(value);}//--------------------------------------------------------------------------------------------------// 将字节数组转换为字符串(UTF-8 编码)public static string FromUtf8Bytes(this byte[] bytes){return bytes == null ? null: Encoding.UTF8.GetString(bytes, 0, bytes.Length);}//--------------------------------------------------------------------------------------------------// 将字符串转换为字节数组(UTF-8 编码)public static byte[] ToUtf8Bytes(this string value){return Encoding.UTF8.GetBytes(value);}//--------------------------------------------------------------------------------------------------// 忽略大小写比较两个字符串的顺序public static int CompareIgnoreCase(this string strA, string strB){return String.Compare(strA, strB, StringComparison.InvariantCultureIgnoreCase);}//--------------------------------------------------------------------------------------------------// 使用指定的分隔符连接字符串列表中的所有字符串public static string Join(this List<string> parts, string separator){return String.Join(separator, parts.ToArray());}//--------------------------------------------------------------------------------------------------// 删除字符串中匹配的前缀字符串public static string TrimPrefixes(this string fromString, params string[] prefixes){if (string.IsNullOrEmpty(fromString))return fromString;foreach (var prefix in prefixes){if (fromString.StartsWith(prefix))return fromString.Substring(prefix.Length);}return fromString;}//--------------------------------------------------------------------------------------------------// 将字符串转换为合法的标识符,只包含字母、数字和下划线public static string ToIdentifier(this string fromString){string toString = "";for (int i = 0; i < fromString.Length; i++){char c = fromString[i];if (char.IsLetter(c)|| char.IsDigit(c) && toString.Length > 0|| c == '_'){toString += c;}}return toString.IsNullOrEmpty() ? "_" : toString;}}
}

整段代码的作用是为 string 类型添加了多个扩展方法,包括大小写转换、空字符串检查、字节数组和字符串之间的转换、比较、连接、前缀修剪以及转换为合法标识符等功能。

15.utils

using System;namespace Macad.Common
{// 定义了一个枚举工具类 EnumUtilspublic class EnumUtils{// 获取枚举类型 T 中最大的枚举值的数值表示public static int MaxOrdinal<T>() where T : Enum{int max = 0;// 遍历枚举类型 T 中的所有枚举值foreach (var value in Enum.GetValues(typeof(T))){// 将枚举值转换为整数,并与当前最大值比较max = Math.Max(max, (int)value);}return max; // 返回最大的枚举值的数值表示}//--------------------------------------------------------------------------------------------------}
}

整段代码的作用是提供一个用于枚举类型的工具类,其中的 MaxOrdinal<T>() 方法用于获取枚举类型 T 中最大的枚举值的数值表示。

16.

using System;
using System.Diagnostics;namespace Macad.Common
{// 定义了一个数学工具类 Mathspublic static class Maths{// 精度,表示小数部分的位数public static int Precision{get { return _Precision; }set{_Precision = value;_PrecisionFormatString = "F" + _Precision.ToString();}}// 格式化精度的字符串public static string PrecisionFormatString{get { return _PrecisionFormatString; }}// 精度,默认为 3static int _Precision = 3;// 格式化精度的字符串,默认为 "F3"static string _PrecisionFormatString = "F3";//--------------------------------------------------------------------------------------------------// 一些常用的角度和弧度的常量public const double DoublePI = Math.PI * 2;public const double HalfPI = Math.PI / 2;public const double PI = Math.PI;public const double DegRadMultiplier = 180.0 / Math.PI;//--------------------------------------------------------------------------------------------------// 将角度归一化到 [0, 360) 范围内public static double NormalizeAngleDegree(double value){if (value >= 360.0){return value % 360.0;}if (value < 0.0){value = (value % 360.0);if (value < 0.0)value += 360.0;return value;}return value;}//--------------------------------------------------------------------------------------------------// 将角度归一化到指定范围内public static double NormalizeAngleDegree(double value, double min, double max){Debug.Assert(max - min >= 360.0);while (value >= max){value -= 360.0;}while (value < min){value += 360.0;}return value;}//--------------------------------------------------------------------------------------------------// 将弧度归一化到 [0, 2π) 范围内public static double NormalizeAngleRad(double value){if (value >= DoublePI){return value % DoublePI;}if (value < 0.0){value = (value % DoublePI);if (value < 0.0)value += DoublePI;return value;}return value;}//--------------------------------------------------------------------------------------------------// 将弧度归一化到指定范围内public static double NormalizeAngleRad(double value, double min, double max){Debug.Assert(max - min >= DoublePI);while (value >= max){value -= DoublePI;}while (value < min){value += DoublePI;}return value;}//--------------------------------------------------------------------------------------------------// 将值四舍五入到最接近的整数倍public static double RoundToNearest(double value, double divider){return Math.Round(value / divider) * divider;}//--------------------------------------------------------------------------------------------------}
}

整段代码的作用是提供了一系列与数学相关的静态方法和常量,包括角度和弧度的归一化、精度控制、常用的角度和弧度的常量定义等。

17.

using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using Macad.Common.Interop;namespace Macad.Common
{// 路径操作工具类public class PathUtils{// 目录分隔符数组static readonly char[] _DirectorySeparators = { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };// 目录分隔符字符串static readonly string _DirectorySeparator = Path.DirectorySeparatorChar.ToString();static readonly string _AltDirectorySeparator = Path.AltDirectorySeparatorChar.ToString();//--------------------------------------------------------------------------------------------------/// <summary>/// 从一个文件或文件夹到另一个文件或文件夹创建相对路径。/// </summary>/// <param name="fromDirectory">定义相对路径起点的目录。</param>/// <param name="toPath">定义相对路径终点的路径。</param>/// <returns>从起始目录到终点路径的相对路径。</returns>/// <exception cref="ArgumentNullException"></exception>// 由 Paul Welter 提供的代码片段// 来源:http://weblogs.asp.net/pwelter34/archive/2006/02/08/create-a-relative-path-code-snippet.aspxpublic static string MakePathRelative(string fromDirectory, string toPath){if (fromDirectory == null)throw new ArgumentNullException("fromDirectory");if (toPath == null)throw new ArgumentNullException("toPath");bool isRooted = Path.IsPathRooted(fromDirectory)&& Path.IsPathRooted(toPath);if (isRooted){bool isDifferentRoot = String.Compare(Path.GetPathRoot(fromDirectory),Path.GetPathRoot(toPath), StringComparison.OrdinalIgnoreCase) != 0;if (isDifferentRoot)return toPath;}StringCollection relativePath = new StringCollection();string[] fromDirectories = SplitPath(fromDirectory);string[] toDirectories = SplitPath(toPath);int length = Math.Min(fromDirectories.Length,toDirectories.Length);int lastCommonRoot = -1;// 查找共同的根路径for (int x = 0; x < length; x++){if (string.Compare(fromDirectories[x],toDirectories[x], true) != 0)break;lastCommonRoot = x;}if (lastCommonRoot == -1)return toPath;// 添加起始路径中的相对文件夹for (int x = lastCommonRoot + 1; x < fromDirectories.Length; x++)if (fromDirectories[x].Length > 0)relativePath.Add("..");// 添加目标文件夹到路径for (int x = lastCommonRoot + 1; x < toDirectories.Length; x++)relativePath.Add(toDirectories[x]);// 创建相对路径string[] relativeParts = new string[relativePath.Count];relativePath.CopyTo(relativeParts, 0);string newPath = string.Join(Path.DirectorySeparatorChar.ToString(),relativeParts);return newPath;}//--------------------------------------------------------------------------------------------------// 将相对路径转换为绝对路径public static string MakePathAbsolute(string sRootDirectory, string sRelativePath){if (Path.IsPathRooted(sRelativePath)){return sRelativePath;}StringBuilder sb = new StringBuilder(260); // MAX_PATHif (Win32Api.PathCanonicalize(sb, Path.Combine(sRootDirectory, sRelativePath))){return sb.ToString();}else{return Path.Combine(sRootDirectory, sRelativePath); }}//--------------------------------------------------------------------------------------------------// 获取应用程序可执行文件的目录public static string GetAppExecutableDirectory(){return AppDomain.CurrentDomain.BaseDirectory;}//--------------------------------------------------------------------------------------------------// 获取本地应用程序数据目录public static string GetLocalAppDataDirectory(){return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + Path.DirectorySeparatorChar + "Macad" + Path.DirectorySeparatorChar;}//--------------------------------------------------------------------------------------------------// 获取文件扩展名(不带点)public static string GetExtensionWithoutPoint(string sPath){string ext = Path.GetExtension(sPath);if(!ext.IsNullOrEmpty()){if(ext[0]=='.'){return ext.Substring(1);}}return ext;}//--------------------------------------------------------------------------------------------------// 获取不带扩展名和点的文件名public static string GetFilenameWithoutExtensionAndPoint(string sPath, bool bFullPath){string filename = Path.GetFileNameWithoutExtension(sPath);if (bFullPath){filename = Path.GetDirectoryName(sPath) + @"\" + filename;}if (filename.Length > 0){if(filename[filename.Length-1]=='.'){return filename.Substring(0, filename.Length-1);}}return filename;}//--------------------------------------------------------------------------------------------------// 拆分路径public static String[] SplitPath(string path){return path.Split(_DirectorySeparators, StringSplitOptions.RemoveEmptyEntries);}//--------------------------------------------------------------------------------------------------// 判断路径是否为基路径的子路径public static bool IsSubPathOf(string path, string baseDirPath){string normalizedPath = WithTrailingDirectorySeparator(Path.GetFullPath(path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)));string normalizedBaseDirPath = WithTrailingDirectorySeparator(Path.GetFullPath(baseDirPath.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)));return normalizedPath.StartsWith(normalizedBaseDirPath, StringComparison.OrdinalIgnoreCase);}//--------------------------------------------------------------------------------------------------// 确保路径以目录分隔符结尾public static string WithTrailingDirectorySeparator(string path){if (path.IsNullOrEmpty())throw new ArgumentNullException("path");if (path[path.Length - 1] != Path.DirectorySeparatorChar){return path + Path.DirectorySeparatorChar;}return path;}}}

整段代码的作用是提供了一系列与路径操作相关的静态方法,包括创建相对路径、将相对路径转换为绝对路径、获取应用程序可执行文件的目录、获取本地应用程序数据目录、获取文件扩展名、获取不带扩展名和点的文件名、拆分路径、判断路径是否为基路径的子路径以及确保路径以目录分隔符结尾。

这篇关于macad.commom解析fileio,framework的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727036

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库