@@ -821,6 +821,69 @@ namespace sdk {
821821 return create_instance_method->call <sdk::SystemArray*>(sdk::get_thread_context (), runtime_type, length);
822822 }
823823
824+ sdk::Delegate* VM::create_delegate (sdk::RETypeDefinition* t, uint32_t num_methods) {
825+ if (t == nullptr ) {
826+ return nullptr ;
827+ }
828+
829+ static const auto delegate_type = sdk::find_type_definition (" System.Delegate" );
830+ static const auto combine_method = delegate_type->get_method (" Combine(System.Delegate, System.Delegate)" );
831+
832+ if (combine_method == nullptr ) {
833+ return nullptr ;
834+ }
835+
836+ ::REObjectInfo fake_object_info {
837+ .classInfo = (::REClassInfo*)t,
838+ };
839+
840+ sdk::Delegate fake_delegate_non_empty {
841+ .num_methods = 1 ,
842+ };
843+
844+ fake_delegate_non_empty.info = &fake_object_info;
845+
846+ sdk::Delegate fake_delegate_empty = fake_delegate_non_empty;
847+ fake_delegate_empty.num_methods = 0 ;
848+
849+ sdk::Delegate* new_delegate = &fake_delegate_empty;
850+
851+ auto ctx = sdk::get_thread_context ();
852+
853+ for (uint32_t i = 0 ; i < num_methods; ++i) {
854+ const auto previous_delegate = new_delegate;
855+ new_delegate = combine_method->call <sdk::Delegate*>(ctx, new_delegate, &fake_delegate_non_empty);
856+
857+ if (new_delegate == nullptr ) {
858+ spdlog::error (" [VM::create_delegate] Unable to create delegate." );
859+ return nullptr ;
860+ }
861+ }
862+
863+ if (new_delegate == nullptr || new_delegate == &fake_delegate_empty) {
864+ spdlog::error (" [VM::create_delegate] Unable to create delegate." );
865+ return nullptr ;
866+ }
867+
868+ return new_delegate;
869+ }
870+
871+ sdk::Delegate* VM::create_delegate (::REManagedObject* runtime_type, uint32_t num_methods) {
872+ if (runtime_type == nullptr ) {
873+ return nullptr ;
874+ }
875+
876+ static auto runtime_type_t = sdk::find_type_definition (" System.RuntimeType" );
877+ static auto get_TypeHandle = runtime_type_t ->get_method (" get_TypeHandle" );
878+
879+ if (get_TypeHandle == nullptr ) {
880+ return nullptr ;
881+ }
882+
883+ auto type_handle = (sdk::RETypeDefinition*)get_TypeHandle->invoke (runtime_type).ptr ;
884+ return create_delegate (type_handle, num_methods);
885+ }
886+
824887 ::REManagedObject* VM::create_sbyte (int8_t value) {
825888 static auto sbyte_type = ::sdk::find_type_definition (" System.SByte" );
826889 static auto value_field = [&]() {
0 commit comments