NullBehavior.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. namespace Masuit.Tools.Dynamics.Behaviors;
  6. internal class NullBehavior : ClayBehavior
  7. {
  8. /// <inheritdoc />
  9. public override object GetMember(Func<object> proceed, object self, string name)
  10. {
  11. return NullInstance.Instance;
  12. }
  13. /// <inheritdoc />
  14. public override object GetIndex(Func<object> proceed, object self, IEnumerable<string> keys)
  15. {
  16. return NullInstance.Instance;
  17. }
  18. /// <inheritdoc />
  19. public override object InvokeMember(Func<object> proceed, object self, string name, INamedEnumerable<object> args)
  20. {
  21. if (args.Any())
  22. {
  23. return proceed();
  24. }
  25. return name == "ToString" ? string.Empty : NullInstance.Instance;
  26. }
  27. /// <inheritdoc />
  28. public override object Convert(Func<object> proceed, object self, Type type, bool isExplicit)
  29. {
  30. return type.IsInterface ? proceed() : null;
  31. }
  32. /// <inheritdoc />
  33. public override object BinaryOperation(Func<object> proceed, object self, ExpressionType operation, object value)
  34. {
  35. switch (operation)
  36. {
  37. case ExpressionType.Equal:
  38. return ReferenceEquals(value, NullInstance.Instance) || value == null;
  39. case ExpressionType.NotEqual:
  40. return !ReferenceEquals(value, NullInstance.Instance) && value != null;
  41. }
  42. return proceed();
  43. }
  44. }