Advertisement
phi2dao

Sporangium.Expressions

Sep 26th, 2024 (edited)
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. static IEnumerable<Expression> GetSetProps<TSelf>(
  2. Expression self, Expression other, bool copy)
  3. {
  4. PropertyInfo info = typeof(TSelf).GetProperty(nameof(Loaded));
  5. var iloaded = Expression.Property(self, info);
  6. var uloaded = Expression.Property(other, info);
  7. MethodInfo add = typeof(HashSet<string>).GetMethod(nameof(Add));
  8.  
  9. foreach (info in GetValidProps(typeof(TSelf)))
  10. {
  11. var iprop = Expression.Property(self, info);
  12. var uprop = Expression.Property(other, info);
  13. var assign = Expression.Assign(iprop, uprop);
  14. var name = Expression.Constant(info.Name);
  15. var call = Expression.Call(iloaded, add, name);
  16. var block = Expression.Block(assign, call);
  17. var cond = MakeCond(iloaded, uloaded, name, copy);
  18. var ifthen = Expression.IfThen(cond, block);
  19. yield return ifthen;
  20. }
  21. }
  22.  
  23. static Expression MakeCond(
  24. Expression iloaded, Expression uloaded, Expression name, bool copy)
  25. {
  26. MethodInfo contains = typeof(HashSet<string>).GetMethod(nameof(Contains));
  27. var icall = Expression.Call(iloaded, contains, name);
  28. var ucall = Expression.Call(uloaded, contains, name);
  29. var lnot = Expression.Not(icall);
  30. var land = Expression.AndAlso(lnot, ucall);
  31. return copy ? land : ucall;
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement