ReflectionExtensions.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Runtime.CompilerServices;
  6. namespace Jint.Extensions
  7. {
  8. internal static class ReflectionExtensions
  9. {
  10. internal static void SetValue(this MemberInfo memberInfo, object forObject, object value)
  11. {
  12. if (memberInfo.MemberType == MemberTypes.Field)
  13. {
  14. var fieldInfo = (FieldInfo) memberInfo;
  15. if (value != null && fieldInfo.FieldType.IsInstanceOfType(value))
  16. {
  17. fieldInfo.SetValue(forObject, value);
  18. }
  19. }
  20. else if (memberInfo.MemberType == MemberTypes.Property)
  21. {
  22. var propertyInfo = (PropertyInfo) memberInfo;
  23. if (value != null && propertyInfo.PropertyType.IsInstanceOfType(value))
  24. {
  25. propertyInfo.SetValue(forObject, value);
  26. }
  27. }
  28. }
  29. internal static Type GetDefinedType(this MemberInfo memberInfo)
  30. {
  31. return memberInfo switch
  32. {
  33. PropertyInfo propertyInfo => propertyInfo.PropertyType,
  34. FieldInfo fieldInfo => fieldInfo.FieldType,
  35. _ => null
  36. };
  37. }
  38. internal static IEnumerable<MethodInfo> GetExtensionMethods(this Type type)
  39. {
  40. return type.GetMethods(BindingFlags.Public | BindingFlags.Static)
  41. .Where(m => m.IsExtensionMethod());
  42. }
  43. private static bool IsExtensionMethod(this MethodBase methodInfo)
  44. {
  45. return methodInfo.IsDefined(typeof(ExtensionAttribute), true);
  46. }
  47. }
  48. }