Transform a .NET OrderForm to COM OrderForm

Have you ever wanted to get the Commerce Server managed OrderForm transformed into the Dictionary key pair values? If the answer is yes then keep reading.

There are some scenarios where you just want the OrderForm in Dictionary format so you can call the pipeline components directly or execute the managed pipelines. Please be aware that you can execute the pipeline components outside ASP.NET. For more info please read the following link.

If you have read my pipeline posts then you know that when executing a pipeline, Commerce Server under the covers will transform your managed OrderForm(s) into Commerce Server Dictionary object(s). For whatever reason, the Commerce Server Product Group did not make the PipelineAdapter public. The PipelineAdapter object is responsible for transformation of the OrderForm. So how can you do this if the class is not public? Reflection.

The following code will show you how to transform the OrderForm. You will need to reference the Microsoft.CommerceServer.Runtime.dll and Microsoft.CommerceServer.Interop.dll. You will also need to make sure that you have an app.config with the order node.

// Get an order context to work withOrderContext context = OrderContext.Create("CSharpSite");// Get a user basketBasket cart = context.GetBasket(new Guid(userId));// Make sure that we have a OrderFormif (cart.OrderForms.Count == 0){    cart.OrderForms.Add(new OrderForm());} // Do magic with reflectionType orderContext = context.GetType();// PipelineAdapterMap is a property of the order contextPropertyInfo property = orderContext.GetProperty("PipelineAdapterMap", BindingFlags.Instance | BindingFlags.NonPublic);

// Get the value of the PipelineAdapterMap propertyobject obj = property.GetValue(context, null);Type pipelineAdapter = obj.GetType();            MethodInfo[] methods = pipelineAdapter.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);

object[] orderform = new object[1];orderform[0] = cart.OrderForms[0];

 

// Method 15 has is what we want and pass it our managed OrderFormobject dict = methods[16].Invoke(obj, orderform);

 

// Do something with the Dictionary OrderFormDictionary dictionary = (Dictionary)dict;