C#如何将一个struct的成员复制到另一个更大的struct中
C# 结构体同名成员批量复制方案
下面是3种无需逐行手动赋值的实现方式,可根据你的场景选择:
反射实现(通用无依赖)
适合临时使用、调用频率低的场景,无需额外引入依赖,只需要写一次通用复制方法即可复用:// 通用复制方法,可全局复用 public static void CopySameNameFields<TSrc, TDest>(TSrc source, ref TDest dest) where TSrc : struct where TDest : struct { var srcFields = typeof(TSrc).GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); var destFields = typeof(TDest).GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); foreach (var srcField in srcFields) { var matchedDestField = destFields.FirstOrDefault(f => f.Name == srcField.Name && f.FieldType == srcField.FieldType); if (matchedDestField != null) { matchedDestField.SetValueDirect(__makeref(dest), srcField.GetValueDirect(__makeref(source))); } } }调用方式非常简单:
CopySameNameFields(GR, ref FR);自定义类型转换(性能最优)
适合高频调用、结构体结构稳定的场景,无额外性能开销,类型安全:
只需要在gr结构体定义中新增显式转换运算符即可:public struct gr { public double O,C,L; public bool isLastFRH, isLastFRL; public static explicit operator fr(gr source) { return new fr() { O = source.O, C = source.C, L = source.L, isLastFRH = source.isLastFRH, isLastFRL = source.isLastFRL // fr的其他额外成员会自动取默认值,可后续单独赋值 }; } }调用方式:
FR = (fr)GR;映射库实现(适合已有映射组件的项目)
如果你的项目已经引入了AutoMapper这类映射组件,可直接配置映射规则使用,无需自己实现反射逻辑:// 全局仅需配置一次 var config = new MapperConfiguration(cfg => cfg.CreateMap<gr, fr>()); var mapper = config.CreateMapper(); // 赋值调用 FR = mapper.Map<fr>(GR);
内容的提问来源于stack exchange,提问作者Roblogic
相关产品推荐
相关产品推荐

