The Couchbase .Net API appears to only use generic methods. Has anyone already dealt with this, before we start writing wrappers in C#?
bucket.GetDocument<dynamic>("document_id")
Thanks,
Gerry
The ABL does not support generic methods
knowledgebase.progress.com/.../Can-NET-Generic-Methods-be-called-in-ABL
Reflection is your friend.
Reflection is my friend!! Working example below.
Mike - I had to debug to get ReflectionHelper.cls when using methods with parameters.. You are adding objects to the paremeterTypes array and Types to the object Array:
oParameterTypes:SetValue (poParameter1, 0) .
oParameters:SetValue (Progress.Util.TypeHelper:GetType (pcParameterType1), 0) .
For the archive, here is a working example against the Couchbase sample DB with some code stolen from Mike:
DEFINE VARIABLE oObjectType AS System.Type NO-UNDO . DEFINE VARIABLE oMethodInfo AS System.Reflection.MethodInfo NO-UNDO . DEFINE VARIABLE oGenericMethod AS System.Reflection.MethodInfo NO-UNDO . DEFINE VARIABLE oObjectTypeOfArray AS "System.Type[]" NO-UNDO . DEFINE VARIABLE oParameters AS "System.Object[]" NO-UNDO . DEFINE VARIABLE oParameterTypes AS "System.Type[]" NO-UNDO . DEFINE VARIABLE uri AS System.Uri NO-UNDO. DEFINE VARIABLE cluster AS Couchbase.Cluster NO-UNDO. DEFINE VARIABLE bucket AS Couchbase.Core.IBucket NO-UNDO. DEFINE VARIABLE clientConfiguration AS Couchbase.Configuration.Client.ClientConfiguration NO-UNDO. DEFINE VARIABLE uriList AS CLASS "System.Collections.Generic.List<System.Uri>" NO-UNDO. DEFINE VARIABLE documentResult AS CLASS "Couchbase.DocumentResult<Newtonsoft.Json.Linq.JObject>" NO-UNDO. DEFINE VARIABLE sysObj AS System.object NO-UNDO. DEFINE VARIABLE jObject AS Newtonsoft.Json.Linq.JObject NO-UNDO. uri = NEW System.Uri ("http://YourServer:8091"). uriList = NEW "System.Collections.Generic.List<System.Uri>" (). uriList:Add(uri). clientConfiguration = NEW Couchbase.Configuration.Client.ClientConfiguration ( ). clientConfiguration:Servers = uriList. cluster = NEW Couchbase.Cluster(clientConfiguration). bucket = cluster:OpenBucket("travel-sample"). // Define an array filled with System.Type to define the .net type of the return value oObjectTypeOfArray = CAST (System.Array:CreateInstance (Progress.Util.TypeHelper:GetType("System.Type"), 1), "System.Type[]") . // fill the methodtype array with the type of objects that the method returns oObjectTypeOfArray:SetValue (Progress.Util.TypeHelper:GetType ("Newtonsoft.Json.Linq.JObject"), 0) . // Define an array filled with System.Object to hold the parameter values for the dynamic method oParameters = CAST (System.Array:CreateInstance (Progress.Util.TypeHelper:GetType("System.Object"), 1), "System.Object[]") . // Define an array filled with System.Type to hold the parameter types for the dynamic method (system.String, System.Int, etc. oParameterTypes = CAST (System.Array:CreateInstance (Progress.Util.TypeHelper:GetType("System.Type"), 1), "System.Type[]"). // fill the parameter arrays with the values and their .net types oParameterTypes:SetValue (Progress.Util.TypeHelper:GetType ("System.String"), 0) . oParameters:SetValue ( ("airline_10"), 0) . // Get the system.type of the parent object oObjectType = bucket:GetType () . // Find the method by name with the correct signature based on the parameters in the type array oMethodInfo = oObjectType:GetMethod ("GetDocument", oParameterTypes) . // make a generic method that returns the types in the objectTypeArray oGenericMethod = oMethodInfo:MakeGenericMethod (oObjectTypeOfArray) . sysObj = oGenericMethod:Invoke (bucket, oParameters) . documentResult = CAST (sysObj, "Couchbase.DocumentResult<Newtonsoft.Json.Linq.JObject>"). jObject = documentResult:Content. IF documentResult:Success THEN MESSAGE jObject:GetValue("name") VIEW-AS ALERT-BOX. ELSE MESSAGE "ERROR: " documentResult:STATUS VIEW-AS ALERT-BOX. RETURN