FieldInfoDescriptor.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Globalization;
  2. using System.Reflection;
  3. using Jint.Native;
  4. namespace Jint.Runtime.Descriptors.Specialized
  5. {
  6. public sealed class FieldInfoDescriptor : PropertyDescriptor
  7. {
  8. private readonly Engine _engine;
  9. private readonly FieldInfo _fieldInfo;
  10. private readonly object _item;
  11. public FieldInfoDescriptor(Engine engine, FieldInfo fieldInfo, object item)
  12. {
  13. _engine = engine;
  14. _fieldInfo = fieldInfo;
  15. _item = item;
  16. Writable = !fieldInfo.Attributes.HasFlag(FieldAttributes.InitOnly); // don't write to fields marked as readonly
  17. }
  18. public override JsValue Value
  19. {
  20. get
  21. {
  22. return JsValue.FromObject(_engine, _fieldInfo.GetValue(_item));
  23. }
  24. set
  25. {
  26. var currentValue = value;
  27. object obj;
  28. if (_fieldInfo.FieldType == typeof (JsValue))
  29. {
  30. obj = currentValue;
  31. }
  32. else
  33. {
  34. // attempt to convert the JsValue to the target type
  35. obj = currentValue.ToObject();
  36. if (obj.GetType() != _fieldInfo.FieldType)
  37. {
  38. obj = _engine.ClrTypeConverter.Convert(obj, _fieldInfo.FieldType, CultureInfo.InvariantCulture);
  39. }
  40. }
  41. _fieldInfo.SetValue(_item, obj);
  42. }
  43. }
  44. }
  45. }