2022年6月16日 星期四

淺層複製物件 by 走訪屬性

 public static T1 Clone<T1>(this object a, T1 target = default)
        {
            var obj = target == null ? (T1)Activator.CreateInstance(typeof(T1)) : target;
            foreach (var pbase in a.GetType().GetProperties())
            {
                var p = obj.GetType().GetProperties().Where(b => b.CanWrite && pbase.Name == b.Name && (pbase.PropertyType == b.PropertyType || pbase.PropertyType.IsAssignableFrom(b.PropertyType) || b.PropertyType.IsAssignableFrom(pbase.PropertyType))).SingleOrDefault(); // 考慮同型態但nullable 不同也進行複製(如 datetime? 和 datetime)
                if (p != null) p.SetValue(obj, pbase.GetValue(a, null), null);
            }
            return obj;
        }

用法:
a.Clone(b)
var b = a.Clone<xxx>()

沒有留言:

自訂權限驗證機制

// 使用 filter [Route("api/[controller]")] [ApiController] [Authorize] [TypeFilter(typeof(CustomAsyncAuthorizationFilter))] public c...