SerializableExpression.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 expression)
  16. {
  17. Expression = expression;
  18. }
  19. public SerializableExpression(Expression<Func<T, object?>> expression)
  20. {
  21. Expression = CoreUtils.ExtractMemberExpression(expression);
  22. }
  23. public SerializableExpression()
  24. {
  25. Expression = Expression.Parameter(typeof(T), "x");
  26. }
  27. public SerializableExpression(string property)
  28. {
  29. Expression = CoreUtils.GetMemberExpression(typeof(T), property);
  30. }
  31. public SerializableExpression(SerializableExpression<T> other)
  32. {
  33. Expression = other.Expression;
  34. }
  35. public Expression Expression { get; set; }
  36. public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  37. {
  38. info.AddValue("Expression", CoreUtils.ExpressionToString(typeof(T), Expression, true));
  39. Serialize(info, context);
  40. }
  41. public abstract void Serialize(SerializationInfo info, StreamingContext context);
  42. public abstract void Deserialize(SerializationInfo info, StreamingContext context);
  43. public override string ToString()
  44. {
  45. return Expression != null ? CoreUtils.ExpressionToString(typeof(T), Expression, true) : "";
  46. }
  47. }
  48. }