SerializableExpression.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 Expression Expression { get; set; }
  28. public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  29. {
  30. info.AddValue("Expression", CoreUtils.ExpressionToString(typeof(T), Expression, true));
  31. Serialize(info, context);
  32. }
  33. public abstract void Serialize(SerializationInfo info, StreamingContext context);
  34. public abstract void Deserialize(SerializationInfo info, StreamingContext context);
  35. public override string ToString()
  36. {
  37. return Expression != null ? CoreUtils.ExpressionToString(typeof(T), Expression, true) : "";
  38. }
  39. }
  40. }