SerializableExpression.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Linq.Expressions;
  3. using System.Runtime.Serialization;
  4. namespace InABox.Core
  5. {
  6. [Serializable]
  7. public abstract class SerializableExpression<T> : ISerializable // where T : Entity
  8. {
  9. protected SerializableExpression(SerializationInfo info, StreamingContext context)
  10. {
  11. var value = (string)info.GetValue("Expression", typeof(string));
  12. Expression = CoreUtils.StringToExpression(value);
  13. Deserialize(info, context);
  14. }
  15. public SerializableExpression(Expression<Func<T, object?>> expression)
  16. {
  17. Expression = CoreUtils.ExtractMemberExpression(expression);
  18. }
  19. public SerializableExpression()
  20. {
  21. Expression = Expression.Parameter(typeof(T), "x");
  22. }
  23. public SerializableExpression(string property)
  24. {
  25. Expression = CoreUtils.GetMemberExpression(typeof(T), property);
  26. }
  27. public SerializableExpression(SerializableExpression<T> other)
  28. {
  29. Expression = other.Expression;
  30. }
  31. public Expression Expression { get; set; }
  32. public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  33. {
  34. info.AddValue("Expression", CoreUtils.ExpressionToString(typeof(T), Expression, true));
  35. Serialize(info, context);
  36. }
  37. public abstract void Serialize(SerializationInfo info, StreamingContext context);
  38. public abstract void Deserialize(SerializationInfo info, StreamingContext context);
  39. public override string ToString()
  40. {
  41. return Expression != null ? CoreUtils.ExpressionToString(typeof(T), Expression, true) : "";
  42. }
  43. }
  44. }