BsMonoClass.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include "BsMonoPrerequisites.h"
  3. #include <mono/jit/jit.h>
  4. namespace BansheeEngine
  5. {
  6. class BS_MONO_EXPORT MonoClass
  7. {
  8. struct MethodId
  9. {
  10. struct Hash
  11. {
  12. inline size_t operator()(const MethodId& v) const;
  13. };
  14. struct Equals
  15. {
  16. inline bool operator()(const MethodId &a, const MethodId &b) const;
  17. };
  18. MethodId(const CM::String& name, CM::UINT32 numParams);
  19. CM::String name;
  20. CM::UINT32 numParams;
  21. };
  22. public:
  23. ~MonoClass();
  24. const CM::String& getNamespace() const { return mNamespace; }
  25. const CM::String& getTypeName() const { return mTypeName; }
  26. const CM::String& getFullName() const { return mFullName; }
  27. MonoMethod& getMethod(const CM::String& name, CM::UINT32 numParams = 0);
  28. MonoField* getField(const CM::String& name) const;
  29. MonoProperty& getProperty(const CM::String& name);
  30. MonoObject* getAttribute(MonoClass* monoClass) const;
  31. MonoClass* getBaseClass() const;
  32. /**
  33. * @brief Retrieves a method, expects exact method name with parameters.
  34. *
  35. * @note Example: Name = "CreateInstance", Signature = "type,int[]"
  36. */
  37. MonoMethod* getMethodExact(const CM::String& name, const CM::String& signature);
  38. /**
  39. * @brief Returns all fields belonging to this class.
  40. *
  41. * @note Be aware this will not include the fields of any base classes.
  42. */
  43. const CM::Vector<MonoField*>::type getAllFields() const;
  44. bool hasAttribute(MonoClass* monoClass) const;
  45. bool hasField(const CM::String& name) const;
  46. bool isSubClassOf(const BS::MonoClass* monoClass) const;
  47. bool isInstanceOfType(MonoObject* object) const;
  48. MonoObject* invokeMethod(const CM::String& name, MonoObject* instance = nullptr, void** params = nullptr, CM::UINT32 numParams = 0);
  49. void addInternalCall(const CM::String& name, const void* method);
  50. ::MonoClass* _getInternalClass() const { return mClass; }
  51. MonoObject* createInstance(bool construct = true) const;
  52. MonoObject* createInstance(void** params, CM::UINT32 numParams);
  53. MonoObject* createInstance(const CM::String& ctorSignature, void** params);
  54. private:
  55. friend class MonoAssembly;
  56. MonoClass(const CM::String& ns, const CM::String& type, ::MonoClass* monoClass, const MonoAssembly* parentAssembly);
  57. const MonoAssembly* mParentAssembly;
  58. ::MonoClass* mClass;
  59. CM::String mNamespace;
  60. CM::String mTypeName;
  61. CM::String mFullName;
  62. CM::UnorderedMap<MethodId, MonoMethod*, MethodId::Hash, MethodId::Equals>::type mMethods;
  63. mutable CM::UnorderedMap<CM::String, MonoField*>::type mFields;
  64. CM::UnorderedMap<CM::String, MonoProperty*>::type mProperties;
  65. mutable bool mHasCachedFields;
  66. mutable CM::Vector<MonoField*>::type mCachedFieldList;
  67. };
  68. }