ObjectWrapper .cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.Linq;
  3. using System.Reflection;
  4. using Jint.Native.Object;
  5. using Jint.Runtime.Descriptors;
  6. using Jint.Runtime.Descriptors.Specialized;
  7. namespace Jint.Runtime.Interop
  8. {
  9. /// <summary>
  10. /// Wrapps a CLR instance
  11. /// </summary>
  12. public sealed class ObjectWrapper : ObjectInstance, IObjectWrapper
  13. {
  14. public Object Target { get; set; }
  15. public ObjectWrapper(Engine engine, Object obj): base(engine)
  16. {
  17. Target = obj;
  18. }
  19. public override PropertyDescriptor GetOwnProperty(string propertyName)
  20. {
  21. PropertyDescriptor x;
  22. if (Properties.TryGetValue(propertyName, out x))
  23. {
  24. return x;
  25. }
  26. var type = Target.GetType();
  27. // look for a property
  28. var property = type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
  29. .FirstOrDefault(m => m.Name == propertyName);
  30. if (property != null)
  31. {
  32. var descriptor = new ClrDataDescriptor(Engine, property, Target);
  33. Properties.Add(propertyName, descriptor);
  34. return descriptor;
  35. }
  36. // if no properties were found then look for a method
  37. var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public)
  38. .Where(m => m.Name == propertyName)
  39. .ToArray();
  40. if (methods.Any())
  41. {
  42. return new PropertyDescriptor(new MethodInfoFunctionInstance(Engine, methods), false, true, false);
  43. }
  44. return PropertyDescriptor.Undefined;
  45. }
  46. }
  47. }