BsManagedSerializableObjectInfo.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsManagedSerializableObjectInfo.h"
  4. #include "BsManagedSerializableObjectInfoRTTI.h"
  5. #include "BsScriptRange.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsMonoClass.h"
  8. #include "BsMonoManager.h"
  9. #include "BsMonoField.h"
  10. #include "BsMonoProperty.h"
  11. #include "BsScriptTexture2D.h"
  12. #include "BsScriptSpriteTexture.h"
  13. #include "BsScriptAssemblyManager.h"
  14. #include "BsScriptTexture3D.h"
  15. #include "BsScriptTextureCube.h"
  16. #include "BsScriptMaterial.h"
  17. #include "BsScriptMesh.h"
  18. #include "BsScriptFont.h"
  19. #include "BsScriptShader.h"
  20. #include "BsScriptShaderInclude.h"
  21. #include "BsScriptPlainText.h"
  22. #include "BsScriptScriptCode.h"
  23. #include "BsScriptStringTable.h"
  24. #include "BsScriptGUISkin.h"
  25. #include "BsScriptPhysicsMaterial.h"
  26. #include "BsScriptPhysicsMesh.h"
  27. #include "BsScriptAudioClip.h"
  28. #include "BsScriptAnimationClip.h"
  29. #include "BsScriptPrefab.h"
  30. #include "BsScriptManagedResource.h"
  31. #include <BsScriptStep.h>
  32. namespace BansheeEngine
  33. {
  34. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTIStatic()
  35. {
  36. return ManagedSerializableAssemblyInfoRTTI::instance();
  37. }
  38. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTI() const
  39. {
  40. return ManagedSerializableAssemblyInfo::getRTTIStatic();
  41. }
  42. ManagedSerializableObjectInfo::ManagedSerializableObjectInfo()
  43. :mMonoClass(nullptr)
  44. {
  45. }
  46. SPtr<ManagedSerializableMemberInfo> ManagedSerializableObjectInfo::findMatchingField(const SPtr<ManagedSerializableMemberInfo>& fieldInfo,
  47. const SPtr<ManagedSerializableTypeInfo>& fieldTypeInfo) const
  48. {
  49. const ManagedSerializableObjectInfo* objInfo = this;
  50. while (objInfo != nullptr)
  51. {
  52. if (objInfo->mTypeInfo->matches(fieldTypeInfo))
  53. {
  54. auto iterFind = objInfo->mFieldNameToId.find(fieldInfo->mName);
  55. if (iterFind != objInfo->mFieldNameToId.end())
  56. {
  57. auto iterFind2 = objInfo->mFields.find(iterFind->second);
  58. if (iterFind2 != objInfo->mFields.end())
  59. {
  60. SPtr<ManagedSerializableMemberInfo> foundField = iterFind2->second;
  61. if (foundField->isSerializable())
  62. {
  63. if (fieldInfo->mTypeInfo->matches(foundField->mTypeInfo))
  64. return foundField;
  65. }
  66. }
  67. }
  68. return nullptr;
  69. }
  70. if (objInfo->mBaseClass != nullptr)
  71. objInfo = objInfo->mBaseClass.get();
  72. else
  73. objInfo = nullptr;
  74. }
  75. return nullptr;
  76. }
  77. RTTITypeBase* ManagedSerializableObjectInfo::getRTTIStatic()
  78. {
  79. return ManagedSerializableObjectInfoRTTI::instance();
  80. }
  81. RTTITypeBase* ManagedSerializableObjectInfo::getRTTI() const
  82. {
  83. return ManagedSerializableObjectInfo::getRTTIStatic();
  84. }
  85. ManagedSerializableMemberInfo::ManagedSerializableMemberInfo()
  86. :mFieldId(0), mFlags(0)
  87. {
  88. }
  89. RTTITypeBase* ManagedSerializableMemberInfo::getRTTIStatic()
  90. {
  91. return ManagedSerializableMemberInfoRTTI::instance();
  92. }
  93. RTTITypeBase* ManagedSerializableMemberInfo::getRTTI() const
  94. {
  95. return ManagedSerializableMemberInfo::getRTTIStatic();
  96. }
  97. ManagedSerializableFieldInfo::ManagedSerializableFieldInfo()
  98. :mMonoField(nullptr)
  99. {
  100. }
  101. float ManagedSerializableFieldInfo::getRangeMinimum() const
  102. {
  103. if (mFlags.isSet(ScriptFieldFlag::Range))
  104. {
  105. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  106. if (range != nullptr)
  107. {
  108. float min = 0;
  109. ScriptRange::getMinRangeField()->getValue(mMonoField->getAttribute(range), &min);
  110. return min;
  111. }
  112. }
  113. return 0;
  114. }
  115. float ManagedSerializableFieldInfo::getRangeMaximum() const
  116. {
  117. if (mFlags.isSet(ScriptFieldFlag::Range))
  118. {
  119. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  120. if (range != nullptr)
  121. {
  122. float max = 0;
  123. ScriptRange::getMaxRangeField()->getValue(mMonoField->getAttribute(range), &max);
  124. return max;
  125. }
  126. }
  127. return 0;
  128. }
  129. bool ManagedSerializableFieldInfo::renderAsSlider() const
  130. {
  131. if (mFlags.isSet(ScriptFieldFlag::Range))
  132. {
  133. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  134. if (range != nullptr)
  135. {
  136. bool slider = false;
  137. ScriptRange::getSliderField()->getValue(mMonoField->getAttribute(range), &slider);
  138. return slider;
  139. }
  140. }
  141. return false;
  142. }
  143. float ManagedSerializableFieldInfo::getStep() const
  144. {
  145. if (mFlags.isSet(ScriptFieldFlag::Step))
  146. {
  147. MonoClass* step = ScriptAssemblyManager::instance().getStepAttribute();
  148. if (step != nullptr)
  149. {
  150. float value = 0;
  151. ScriptStep::getStepField()->getValue(mMonoField->getAttribute(step), &value);
  152. return value;
  153. }
  154. }
  155. return 0;
  156. }
  157. MonoObject* ManagedSerializableFieldInfo::getValue(MonoObject* instance) const
  158. {
  159. return mMonoField->getValueBoxed(instance);
  160. }
  161. void ManagedSerializableFieldInfo::setValue(MonoObject* instance, void* value) const
  162. {
  163. mMonoField->setValue(instance, value);
  164. }
  165. RTTITypeBase* ManagedSerializableFieldInfo::getRTTIStatic()
  166. {
  167. return ManagedSerializableFieldInfoRTTI::instance();
  168. }
  169. RTTITypeBase* ManagedSerializableFieldInfo::getRTTI() const
  170. {
  171. return ManagedSerializableFieldInfo::getRTTIStatic();
  172. }
  173. ManagedSerializablePropertyInfo::ManagedSerializablePropertyInfo()
  174. :mMonoProperty(nullptr)
  175. {
  176. }
  177. float ManagedSerializablePropertyInfo::getRangeMinimum() const
  178. {
  179. if (mFlags.isSet(ScriptFieldFlag::Range))
  180. {
  181. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  182. if (range != nullptr)
  183. {
  184. float min = 0;
  185. ScriptRange::getMinRangeField()->getValue(mMonoProperty->getAttribute(range), &min);
  186. return min;
  187. }
  188. }
  189. return 0;
  190. }
  191. float ManagedSerializablePropertyInfo::getRangeMaximum() const
  192. {
  193. if (mFlags.isSet(ScriptFieldFlag::Range))
  194. {
  195. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  196. if (range != nullptr)
  197. {
  198. float max = 0;
  199. ScriptRange::getMaxRangeField()->getValue(mMonoProperty->getAttribute(range), &max);
  200. return max;
  201. }
  202. }
  203. return 0;
  204. }
  205. bool ManagedSerializablePropertyInfo::renderAsSlider() const
  206. {
  207. if (mFlags.isSet(ScriptFieldFlag::Range))
  208. {
  209. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  210. if (range != nullptr)
  211. {
  212. bool slider = false;
  213. ScriptRange::getSliderField()->getValue(mMonoProperty->getAttribute(range), &slider);
  214. return slider;
  215. }
  216. }
  217. return false;
  218. }
  219. float ManagedSerializablePropertyInfo::getStep() const
  220. {
  221. if (mFlags.isSet(ScriptFieldFlag::Step))
  222. {
  223. MonoClass* step = ScriptAssemblyManager::instance().getStepAttribute();
  224. if (step != nullptr)
  225. {
  226. float value = 0;
  227. ScriptStep::getStepField()->getValue(mMonoProperty->getAttribute(step), &value);
  228. return value;
  229. }
  230. }
  231. return 0;
  232. }
  233. MonoObject* ManagedSerializablePropertyInfo::getValue(MonoObject* instance) const
  234. {
  235. return mMonoProperty->get(instance);
  236. }
  237. void ManagedSerializablePropertyInfo::setValue(MonoObject* instance, void* value) const
  238. {
  239. mMonoProperty->set(instance, value);
  240. }
  241. RTTITypeBase* ManagedSerializablePropertyInfo::getRTTIStatic()
  242. {
  243. return ManagedSerializablePropertyInfoRTTI::instance();
  244. }
  245. RTTITypeBase* ManagedSerializablePropertyInfo::getRTTI() const
  246. {
  247. return ManagedSerializablePropertyInfo::getRTTIStatic();
  248. }
  249. RTTITypeBase* ManagedSerializableTypeInfo::getRTTIStatic()
  250. {
  251. return ManagedSerializableTypeInfoRTTI::instance();
  252. }
  253. RTTITypeBase* ManagedSerializableTypeInfo::getRTTI() const
  254. {
  255. return ManagedSerializableTypeInfo::getRTTIStatic();
  256. }
  257. bool ManagedSerializableTypeInfoPrimitive::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  258. {
  259. if(!rtti_is_of_type<ManagedSerializableTypeInfoPrimitive>(typeInfo))
  260. return false;
  261. auto primTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  262. return primTypeInfo->mType == mType;
  263. }
  264. bool ManagedSerializableTypeInfoPrimitive::isTypeLoaded() const
  265. {
  266. return mType < ScriptPrimitiveType::Count; // Ignoring some removed types
  267. }
  268. ::MonoClass* ManagedSerializableTypeInfoPrimitive::getMonoClass() const
  269. {
  270. switch(mType)
  271. {
  272. case ScriptPrimitiveType::Bool:
  273. return MonoUtil::getBoolClass();
  274. case ScriptPrimitiveType::Char:
  275. return MonoUtil::getCharClass();
  276. case ScriptPrimitiveType::I8:
  277. return MonoUtil::getSByteClass();
  278. case ScriptPrimitiveType::U8:
  279. return MonoUtil::getByteClass();
  280. case ScriptPrimitiveType::I16:
  281. return MonoUtil::getINT16Class();
  282. case ScriptPrimitiveType::U16:
  283. return MonoUtil::getUINT16Class();
  284. case ScriptPrimitiveType::I32:
  285. return MonoUtil::getINT32Class();
  286. case ScriptPrimitiveType::U32:
  287. return MonoUtil::getUINT32Class();
  288. case ScriptPrimitiveType::I64:
  289. return MonoUtil::getINT64Class();
  290. case ScriptPrimitiveType::U64:
  291. return MonoUtil::getUINT64Class();
  292. case ScriptPrimitiveType::Float:
  293. return MonoUtil::getFloatClass();
  294. case ScriptPrimitiveType::Double:
  295. return MonoUtil::getDoubleClass();
  296. case ScriptPrimitiveType::String:
  297. return MonoUtil::getStringClass();
  298. default:
  299. break;
  300. }
  301. return nullptr;
  302. }
  303. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTIStatic()
  304. {
  305. return ManagedSerializableTypeInfoPrimitiveRTTI::instance();
  306. }
  307. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTI() const
  308. {
  309. return ManagedSerializableTypeInfoPrimitive::getRTTIStatic();
  310. }
  311. bool ManagedSerializableTypeInfoRef::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  312. {
  313. if (!rtti_is_of_type<ManagedSerializableTypeInfoRef>(typeInfo))
  314. return false;
  315. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  316. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName;
  317. }
  318. bool ManagedSerializableTypeInfoRef::isTypeLoaded() const
  319. {
  320. switch (mType)
  321. {
  322. case ScriptReferenceType::Resource:
  323. case ScriptReferenceType::Texture2D:
  324. case ScriptReferenceType::Texture3D:
  325. case ScriptReferenceType::TextureCube:
  326. case ScriptReferenceType::SpriteTexture:
  327. case ScriptReferenceType::Shader:
  328. case ScriptReferenceType::ShaderInclude:
  329. case ScriptReferenceType::Material:
  330. case ScriptReferenceType::Mesh:
  331. case ScriptReferenceType::PlainText:
  332. case ScriptReferenceType::ScriptCode:
  333. case ScriptReferenceType::Prefab:
  334. case ScriptReferenceType::Font:
  335. case ScriptReferenceType::StringTable:
  336. case ScriptReferenceType::GUISkin:
  337. case ScriptReferenceType::PhysicsMaterial:
  338. case ScriptReferenceType::PhysicsMesh:
  339. case ScriptReferenceType::AudioClip:
  340. case ScriptReferenceType::AnimationClip:
  341. case ScriptReferenceType::SceneObject:
  342. case ScriptReferenceType::Component:
  343. return true;
  344. default:
  345. break;
  346. }
  347. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  348. }
  349. ::MonoClass* ManagedSerializableTypeInfoRef::getMonoClass() const
  350. {
  351. switch (mType)
  352. {
  353. case ScriptReferenceType::Resource:
  354. return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
  355. case ScriptReferenceType::Texture2D:
  356. return ScriptTexture2D::getMetaData()->scriptClass->_getInternalClass();
  357. case ScriptReferenceType::Texture3D:
  358. return ScriptTexture3D::getMetaData()->scriptClass->_getInternalClass();
  359. case ScriptReferenceType::TextureCube:
  360. return ScriptTextureCube::getMetaData()->scriptClass->_getInternalClass();
  361. case ScriptReferenceType::SpriteTexture:
  362. return ScriptSpriteTexture::getMetaData()->scriptClass->_getInternalClass();
  363. case ScriptReferenceType::Shader:
  364. return ScriptShader::getMetaData()->scriptClass->_getInternalClass();
  365. case ScriptReferenceType::ShaderInclude:
  366. return ScriptShaderInclude::getMetaData()->scriptClass->_getInternalClass();
  367. case ScriptReferenceType::Material:
  368. return ScriptMaterial::getMetaData()->scriptClass->_getInternalClass();
  369. case ScriptReferenceType::Mesh:
  370. return ScriptMesh::getMetaData()->scriptClass->_getInternalClass();
  371. case ScriptReferenceType::PlainText:
  372. return ScriptPlainText::getMetaData()->scriptClass->_getInternalClass();
  373. case ScriptReferenceType::ScriptCode:
  374. return ScriptScriptCode::getMetaData()->scriptClass->_getInternalClass();
  375. case ScriptReferenceType::Prefab:
  376. return ScriptPrefab::getMetaData()->scriptClass->_getInternalClass();
  377. case ScriptReferenceType::Font:
  378. return ScriptFont::getMetaData()->scriptClass->_getInternalClass();
  379. case ScriptReferenceType::StringTable:
  380. return ScriptStringTable::getMetaData()->scriptClass->_getInternalClass();
  381. case ScriptReferenceType::GUISkin:
  382. return ScriptGUISkin::getMetaData()->scriptClass->_getInternalClass();
  383. case ScriptReferenceType::PhysicsMaterial:
  384. return ScriptPhysicsMaterial::getMetaData()->scriptClass->_getInternalClass();
  385. case ScriptReferenceType::PhysicsMesh:
  386. return ScriptPhysicsMesh::getMetaData()->scriptClass->_getInternalClass();
  387. case ScriptReferenceType::AudioClip:
  388. return ScriptAudioClip::getMetaData()->scriptClass->_getInternalClass();
  389. case ScriptReferenceType::AnimationClip:
  390. return ScriptAnimationClip::getMetaData()->scriptClass->_getInternalClass();
  391. case ScriptReferenceType::SceneObject:
  392. return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
  393. case ScriptReferenceType::Component:
  394. return ScriptAssemblyManager::instance().getComponentClass()->_getInternalClass();
  395. default:
  396. break;
  397. }
  398. // Custom component or resource
  399. SPtr<ManagedSerializableObjectInfo> objInfo;
  400. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  401. return nullptr;
  402. return objInfo->mMonoClass->_getInternalClass();
  403. }
  404. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTIStatic()
  405. {
  406. return ManagedSerializableTypeInfoRefRTTI::instance();
  407. }
  408. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTI() const
  409. {
  410. return ManagedSerializableTypeInfoRef::getRTTIStatic();
  411. }
  412. bool ManagedSerializableTypeInfoObject::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  413. {
  414. if(!rtti_is_of_type<ManagedSerializableTypeInfoObject>(typeInfo))
  415. return false;
  416. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  417. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName && objTypeInfo->mValueType == mValueType;
  418. }
  419. bool ManagedSerializableTypeInfoObject::isTypeLoaded() const
  420. {
  421. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  422. }
  423. ::MonoClass* ManagedSerializableTypeInfoObject::getMonoClass() const
  424. {
  425. SPtr<ManagedSerializableObjectInfo> objInfo;
  426. if(!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  427. return nullptr;
  428. return objInfo->mMonoClass->_getInternalClass();
  429. }
  430. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTIStatic()
  431. {
  432. return ManagedSerializableTypeInfoObjectRTTI::instance();
  433. }
  434. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTI() const
  435. {
  436. return ManagedSerializableTypeInfoObject::getRTTIStatic();
  437. }
  438. bool ManagedSerializableTypeInfoArray::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  439. {
  440. if(!rtti_is_of_type<ManagedSerializableTypeInfoArray>(typeInfo))
  441. return false;
  442. auto arrayTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  443. return arrayTypeInfo->mRank == mRank && arrayTypeInfo->mElementType->matches(mElementType);
  444. }
  445. bool ManagedSerializableTypeInfoArray::isTypeLoaded() const
  446. {
  447. return mElementType->isTypeLoaded();
  448. }
  449. ::MonoClass* ManagedSerializableTypeInfoArray::getMonoClass() const
  450. {
  451. ::MonoClass* elementClass = mElementType->getMonoClass();
  452. if(elementClass == nullptr)
  453. return nullptr;
  454. return ScriptArray::buildArrayClass(mElementType->getMonoClass(), mRank);
  455. }
  456. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTIStatic()
  457. {
  458. return ManagedSerializableTypeInfoArrayRTTI::instance();
  459. }
  460. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTI() const
  461. {
  462. return ManagedSerializableTypeInfoArray::getRTTIStatic();
  463. }
  464. bool ManagedSerializableTypeInfoList::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  465. {
  466. if(!rtti_is_of_type<ManagedSerializableTypeInfoList>(typeInfo))
  467. return false;
  468. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  469. return listTypeInfo->mElementType->matches(mElementType);
  470. }
  471. bool ManagedSerializableTypeInfoList::isTypeLoaded() const
  472. {
  473. return mElementType->isTypeLoaded();
  474. }
  475. ::MonoClass* ManagedSerializableTypeInfoList::getMonoClass() const
  476. {
  477. ::MonoClass* elementClass = mElementType->getMonoClass();
  478. if(elementClass == nullptr)
  479. return nullptr;
  480. MonoClass* genericListClass = ScriptAssemblyManager::instance().getSystemGenericListClass();
  481. ::MonoClass* genParams[1] = { elementClass };
  482. return MonoUtil::bindGenericParameters(genericListClass->_getInternalClass(), genParams, 1);
  483. }
  484. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTIStatic()
  485. {
  486. return ManagedSerializableTypeInfoListRTTI::instance();
  487. }
  488. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTI() const
  489. {
  490. return ManagedSerializableTypeInfoList::getRTTIStatic();
  491. }
  492. bool ManagedSerializableTypeInfoDictionary::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  493. {
  494. if(!rtti_is_of_type<ManagedSerializableTypeInfoDictionary>(typeInfo))
  495. return false;
  496. auto dictTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  497. return dictTypeInfo->mKeyType->matches(mKeyType) && dictTypeInfo->mValueType->matches(mValueType);
  498. }
  499. bool ManagedSerializableTypeInfoDictionary::isTypeLoaded() const
  500. {
  501. return mKeyType->isTypeLoaded() && mValueType->isTypeLoaded();
  502. }
  503. ::MonoClass* ManagedSerializableTypeInfoDictionary::getMonoClass() const
  504. {
  505. ::MonoClass* keyClass = mKeyType->getMonoClass();
  506. ::MonoClass* valueClass = mValueType->getMonoClass();
  507. if(keyClass == nullptr || valueClass == nullptr)
  508. return nullptr;
  509. MonoClass* genericDictionaryClass = ScriptAssemblyManager::instance().getSystemGenericDictionaryClass();
  510. ::MonoClass* params[2] = { keyClass, valueClass };
  511. return MonoUtil::bindGenericParameters(genericDictionaryClass->_getInternalClass(), params, 2);
  512. }
  513. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTIStatic()
  514. {
  515. return ManagedSerializableTypeInfoDictionaryRTTI::instance();
  516. }
  517. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTI() const
  518. {
  519. return ManagedSerializableTypeInfoDictionary::getRTTIStatic();
  520. }
  521. }