A while ago, I needed the opposite of InvRegistry.RegisterInterface(TypeInfo(MySoapInterfacePortType, 'urn:myURN', 'utf-8');
, so instead of registering an interface with a namespace URN, obtain the URN by passing the interface inverting [WayBack] TInvokableClassRegistry.RegisterInterface
.
This is the class helper I wrote:
type TInvokableClassRegistryHelper = class helper for TInvokableClassRegistry public function GetInterfaceNamespace(Info: PTypeInfo): string; end; function TInvokableClassRegistryHelper.GetInterfaceNamespace(Info: PTypeInfo): string; var InfoGuid: TGUID; begin // call like `Result := InvRegistry.GetInterfaceNamespace(TypeInfo(MySoapInterfaceType));` InfoGuid := GetTypeData(Info)^.Guid; // uses TypInfo; see https://stackoverflow.com/questions/8439246/is-it-possible-to-get-the-value-of-a-guid-on-an-interface-using-rtti Result := GetNamespaceByGUID(InfoGuid); end;
It would have been a lot easier if TInvokableClassRegistry.GetIntfIndex
has been public, because then [WayBack]TInvokableClassRegistry.GetRegInterfaceEntry
could have been used.
–jeroen