#pragma once

#include "beatsaber-hook/shared/utils/typedefs.h"
#include "beatsaber-hook/shared/utils/byref.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-methods.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-properties.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-fields.hpp"
#include "beatsaber-hook/shared/utils/utils.h"
#include "beatsaber-hook/shared/utils/typedefs-array.hpp"
#include "beatsaber-hook/shared/utils/typedefs-string.hpp"

namespace System::Collections::Generic {

  template<typename TKey, typename TValue>
  class Dictionary_2;

  template<typename T>
  class List_1;
}

namespace System {

  class WeakReference;
}

namespace System::Dynamic {

  class ExpandoObject;
}

namespace System::Dynamic {

  class ExpandoClass;
}
#include "beatsaber-hook/shared/utils/il2cpp-type-check.hpp"
NEED_NO_BOX(::System::Dynamic::ExpandoClass);
DEFINE_IL2CPP_ARG_TYPE(::System::Dynamic::ExpandoClass*, "System.Dynamic", "ExpandoClass");

namespace System::Dynamic {

  #pragma pack(push, 1)

  class ExpandoClass : public ::Il2CppObject {
    public:
    public:

    ::ArrayW<::StringW> keys;

    static_assert(sizeof(::ArrayW<::StringW>) == 0x8);

    int hashCode;

    static_assert(sizeof(int) == 0x4);

    char __padding1[0x4] = {};

    ::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>* transitions;

    static_assert(sizeof(::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*) == 0x8);
    public:

    static ::System::Dynamic::ExpandoClass* _get_Empty();

    static void _set_Empty(::System::Dynamic::ExpandoClass* value);

    [[deprecated("Use field access instead!")]] ::ArrayW<::StringW>& dyn__keys();

    [[deprecated("Use field access instead!")]] int& dyn__hashCode();

    [[deprecated("Use field access instead!")]] ::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*& dyn__transitions();

    ::ArrayW<::StringW> get_Keys();

    template<::il2cpp_utils::CreationType creationType = ::il2cpp_utils::CreationType::Temporary>
    static ExpandoClass* New_ctor() {
      static auto ___internal__logger = ::Logger::get().WithContext("::System::Dynamic::ExpandoClass::.ctor");
      return THROW_UNLESS((::il2cpp_utils::New<ExpandoClass*, creationType>()));
    }

    template<::il2cpp_utils::CreationType creationType = ::il2cpp_utils::CreationType::Temporary>
    static ExpandoClass* New_ctor(::ArrayW<::StringW> keys, int hashCode) {
      static auto ___internal__logger = ::Logger::get().WithContext("::System::Dynamic::ExpandoClass::.ctor");
      return THROW_UNLESS((::il2cpp_utils::New<ExpandoClass*, creationType>(keys, hashCode)));
    }

    static void _cctor();

    ::System::Dynamic::ExpandoClass* FindNewClass(::StringW newKey);

    ::System::Collections::Generic::List_1<::System::WeakReference*>* GetTransitionList(int hashCode);

    int GetValueIndex(::StringW name, bool caseInsensitive, ::System::Dynamic::ExpandoObject* obj);

    int GetValueIndexCaseSensitive(::StringW name);

    int GetValueIndexCaseInsensitive(::StringW name, ::System::Dynamic::ExpandoObject* obj);
  }; 
  #pragma pack(pop)
  static check_size<sizeof(ExpandoClass), 32 + sizeof(::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*)> __System_Dynamic_ExpandoClassSizeCheck;
  static_assert(sizeof(ExpandoClass) == 0x28);
}
#include "beatsaber-hook/shared/utils/il2cpp-utils-methods.hpp"

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::ArrayW<::StringW> (System::Dynamic::ExpandoClass::*)()>(&System::Dynamic::ExpandoClass::get_Keys)> {
  static const MethodInfo* get() {
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "get_Keys", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<void (*)()>(&System::Dynamic::ExpandoClass::_cctor)> {
  static const MethodInfo* get() {
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), ".cctor", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::System::Dynamic::ExpandoClass* (System::Dynamic::ExpandoClass::*)(::StringW)>(&System::Dynamic::ExpandoClass::FindNewClass)> {
  static const MethodInfo* get() {
    static auto* newKey = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "FindNewClass", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{newKey});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::System::Collections::Generic::List_1<::System::WeakReference*>* (System::Dynamic::ExpandoClass::*)(int)>(&System::Dynamic::ExpandoClass::GetTransitionList)> {
  static const MethodInfo* get() {
    static auto* hashCode = &::il2cpp_utils::GetClassFromName("System", "Int32")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetTransitionList", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{hashCode});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW, bool, ::System::Dynamic::ExpandoObject*)>(&System::Dynamic::ExpandoClass::GetValueIndex)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    static auto* caseInsensitive = &::il2cpp_utils::GetClassFromName("System", "Boolean")->byval_arg;
    static auto* obj = &::il2cpp_utils::GetClassFromName("System.Dynamic", "ExpandoObject")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndex", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name, caseInsensitive, obj});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW)>(&System::Dynamic::ExpandoClass::GetValueIndexCaseSensitive)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndexCaseSensitive", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name});
  }
};

template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW, ::System::Dynamic::ExpandoObject*)>(&System::Dynamic::ExpandoClass::GetValueIndexCaseInsensitive)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    static auto* obj = &::il2cpp_utils::GetClassFromName("System.Dynamic", "ExpandoObject")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndexCaseInsensitive", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name, obj});
  }
};
// Autogenerated from CppHeaderCreator
// Created by Sc2ad
// =========================================================================
#pragma once
// Begin includes
#include "beatsaber-hook/shared/utils/typedefs.h"
#include "beatsaber-hook/shared/utils/byref.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-methods.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-properties.hpp"
#include "beatsaber-hook/shared/utils/il2cpp-utils-fields.hpp"
#include "beatsaber-hook/shared/utils/utils.h"
#include "beatsaber-hook/shared/utils/typedefs-array.hpp"
#include "beatsaber-hook/shared/utils/typedefs-string.hpp"
// Completed includes
// Begin forward declares
// Forward declaring namespace: System::Collections::Generic
namespace System::Collections::Generic {
  // Forward declaring type: Dictionary`2<TKey, TValue>
  template<typename TKey, typename TValue>
  class Dictionary_2;
  // Forward declaring type: List`1<T>
  template<typename T>
  class List_1;
}
// Forward declaring namespace: System
namespace System {
  // Forward declaring type: WeakReference
  class WeakReference;
}
// Forward declaring namespace: System::Dynamic
namespace System::Dynamic {
  // Forward declaring type: ExpandoObject
  class ExpandoObject;
}
// Completed forward declares
// Type namespace: System.Dynamic
namespace System::Dynamic {
  // Forward declaring type: ExpandoClass
  class ExpandoClass;
}
#include "beatsaber-hook/shared/utils/il2cpp-type-check.hpp"
NEED_NO_BOX(::System::Dynamic::ExpandoClass);
DEFINE_IL2CPP_ARG_TYPE(::System::Dynamic::ExpandoClass*, "System.Dynamic", "ExpandoClass");
// Type namespace: System.Dynamic
namespace System::Dynamic {
  // Size: 0x28
  #pragma pack(push, 1)
  // Autogenerated type: System.Dynamic.ExpandoClass
  // [TokenAttribute] Offset: FFFFFFFF
  class ExpandoClass : public ::Il2CppObject {
    public:
    public:
    // private readonly System.String[] _keys
    // Size: 0x8
    // Offset: 0x10
    ::ArrayW<::StringW> keys;
    // Field size check
    static_assert(sizeof(::ArrayW<::StringW>) == 0x8);
    // private readonly System.Int32 _hashCode
    // Size: 0x4
    // Offset: 0x18
    int hashCode;
    // Field size check
    static_assert(sizeof(int) == 0x4);
    // Padding between fields: hashCode and: transitions
    char __padding1[0x4] = {};
    // private System.Collections.Generic.Dictionary`2<System.Int32,System.Collections.Generic.List`1<System.WeakReference>> _transitions
    // Size: 0x8
    // Offset: 0x20
    ::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>* transitions;
    // Field size check
    static_assert(sizeof(::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*) == 0x8);
    public:
    // Get static field: static readonly System.Dynamic.ExpandoClass Empty
    static ::System::Dynamic::ExpandoClass* _get_Empty();
    // Set static field: static readonly System.Dynamic.ExpandoClass Empty
    static void _set_Empty(::System::Dynamic::ExpandoClass* value);
    // Get instance field reference: private readonly System.String[] _keys
    [[deprecated("Use field access instead!")]] ::ArrayW<::StringW>& dyn__keys();
    // Get instance field reference: private readonly System.Int32 _hashCode
    [[deprecated("Use field access instead!")]] int& dyn__hashCode();
    // Get instance field reference: private System.Collections.Generic.Dictionary`2<System.Int32,System.Collections.Generic.List`1<System.WeakReference>> _transitions
    [[deprecated("Use field access instead!")]] ::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*& dyn__transitions();
    // System.String[] get_Keys()
    // Offset: 0x1203404
    ::ArrayW<::StringW> get_Keys();
    // System.Void .ctor()
    // Offset: 0x1202B98
    template<::il2cpp_utils::CreationType creationType = ::il2cpp_utils::CreationType::Temporary>
    static ExpandoClass* New_ctor() {
      static auto ___internal__logger = ::Logger::get().WithContext("::System::Dynamic::ExpandoClass::.ctor");
      return THROW_UNLESS((::il2cpp_utils::New<ExpandoClass*, creationType>()));
    }
    // System.Void .ctor(System.String[] keys, System.Int32 hashCode)
    // Offset: 0x1202C80
    template<::il2cpp_utils::CreationType creationType = ::il2cpp_utils::CreationType::Temporary>
    static ExpandoClass* New_ctor(::ArrayW<::StringW> keys, int hashCode) {
      static auto ___internal__logger = ::Logger::get().WithContext("::System::Dynamic::ExpandoClass::.ctor");
      return THROW_UNLESS((::il2cpp_utils::New<ExpandoClass*, creationType>(keys, hashCode)));
    }
    // static private System.Void .cctor()
    // Offset: 0x120340C
    static void _cctor();
    // System.Dynamic.ExpandoClass FindNewClass(System.String newKey)
    // Offset: 0x1202CBC
    ::System::Dynamic::ExpandoClass* FindNewClass(::StringW newKey);
    // private System.Collections.Generic.List`1<System.WeakReference> GetTransitionList(System.Int32 hashCode)
    // Offset: 0x1203074
    ::System::Collections::Generic::List_1<::System::WeakReference*>* GetTransitionList(int hashCode);
    // System.Int32 GetValueIndex(System.String name, System.Boolean caseInsensitive, System.Dynamic.ExpandoObject obj)
    // Offset: 0x12031A4
    int GetValueIndex(::StringW name, bool caseInsensitive, ::System::Dynamic::ExpandoObject* obj);
    // System.Int32 GetValueIndexCaseSensitive(System.String name)
    // Offset: 0x120337C
    int GetValueIndexCaseSensitive(::StringW name);
    // private System.Int32 GetValueIndexCaseInsensitive(System.String name, System.Dynamic.ExpandoObject obj)
    // Offset: 0x12031B4
    int GetValueIndexCaseInsensitive(::StringW name, ::System::Dynamic::ExpandoObject* obj);
  }; // System.Dynamic.ExpandoClass
  #pragma pack(pop)
  static check_size<sizeof(ExpandoClass), 32 + sizeof(::System::Collections::Generic::Dictionary_2<int, ::System::Collections::Generic::List_1<::System::WeakReference*>*>*)> __System_Dynamic_ExpandoClassSizeCheck;
  static_assert(sizeof(ExpandoClass) == 0x28);
}
#include "beatsaber-hook/shared/utils/il2cpp-utils-methods.hpp"
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::get_Keys
// Il2CppName: get_Keys
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::ArrayW<::StringW> (System::Dynamic::ExpandoClass::*)()>(&System::Dynamic::ExpandoClass::get_Keys)> {
  static const MethodInfo* get() {
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "get_Keys", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::New_ctor
// Il2CppName: .ctor
// Cannot get method pointer of value based method overload from template for constructor!
// Try using FindMethod instead!
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::New_ctor
// Il2CppName: .ctor
// Cannot get method pointer of value based method overload from template for constructor!
// Try using FindMethod instead!
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::_cctor
// Il2CppName: .cctor
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<void (*)()>(&System::Dynamic::ExpandoClass::_cctor)> {
  static const MethodInfo* get() {
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), ".cctor", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::FindNewClass
// Il2CppName: FindNewClass
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::System::Dynamic::ExpandoClass* (System::Dynamic::ExpandoClass::*)(::StringW)>(&System::Dynamic::ExpandoClass::FindNewClass)> {
  static const MethodInfo* get() {
    static auto* newKey = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "FindNewClass", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{newKey});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::GetTransitionList
// Il2CppName: GetTransitionList
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<::System::Collections::Generic::List_1<::System::WeakReference*>* (System::Dynamic::ExpandoClass::*)(int)>(&System::Dynamic::ExpandoClass::GetTransitionList)> {
  static const MethodInfo* get() {
    static auto* hashCode = &::il2cpp_utils::GetClassFromName("System", "Int32")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetTransitionList", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{hashCode});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::GetValueIndex
// Il2CppName: GetValueIndex
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW, bool, ::System::Dynamic::ExpandoObject*)>(&System::Dynamic::ExpandoClass::GetValueIndex)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    static auto* caseInsensitive = &::il2cpp_utils::GetClassFromName("System", "Boolean")->byval_arg;
    static auto* obj = &::il2cpp_utils::GetClassFromName("System.Dynamic", "ExpandoObject")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndex", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name, caseInsensitive, obj});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::GetValueIndexCaseSensitive
// Il2CppName: GetValueIndexCaseSensitive
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW)>(&System::Dynamic::ExpandoClass::GetValueIndexCaseSensitive)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndexCaseSensitive", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name});
  }
};
// Writing MetadataGetter for method: System::Dynamic::ExpandoClass::GetValueIndexCaseInsensitive
// Il2CppName: GetValueIndexCaseInsensitive
template<>
struct ::il2cpp_utils::il2cpp_type_check::MetadataGetter<static_cast<int (System::Dynamic::ExpandoClass::*)(::StringW, ::System::Dynamic::ExpandoObject*)>(&System::Dynamic::ExpandoClass::GetValueIndexCaseInsensitive)> {
  static const MethodInfo* get() {
    static auto* name = &::il2cpp_utils::GetClassFromName("System", "String")->byval_arg;
    static auto* obj = &::il2cpp_utils::GetClassFromName("System.Dynamic", "ExpandoObject")->byval_arg;
    return ::il2cpp_utils::FindMethod(classof(System::Dynamic::ExpandoClass*), "GetValueIndexCaseInsensitive", std::vector<Il2CppClass*>(), ::std::vector<const Il2CppType*>{name, obj});
  }
};
