---
title: Extend order classes
slug: commerce-connect-14/docs/extending-order-classes
docTags: 
createdAt: 2026-07-23T10:25:35.210Z
---

The order system default implementation contains many classes that you can extend with your own fields. This means that you can customize fields to all order objects to help with your business use cases.

Classes in this topic are available in the `Mediachase.Commerce.Orders` namespace. The order classes that you can extend are:

- `Cart`
- `PurchaseOrder`
- `PaymentPlan`
- `OrderForm`
- `Payment`
- `Shipment`
- `LineItem`
- `OrderGroupAddressType`

## Configure a meta-class

**Version 10-13**

1. In the  **Commerce Manager Administration** section, navigate to the **Order System/Meta Class** node.
2. From the **Element** drop-down list, select the correct group type.
3. From the **Type** list, select the meta-class you want to configure. Only the **OrderGroup** and **Payment** group types have multiple type options. Edit meta-class definitions by enabling checkboxes associated with fields you want to associate with each meta-class.
4. To add meta-fields, click the **Order System/Meta Fields** node and select **New/Meta Field**.

## Work with metadata types

The default implementation uses `Mediachase.MetaDataPlus` for its storage of extended attributes.  The list of available types for use in `IExtendedProperties.Properties` are represented in `Mediachase.MetaDataPlus.Configurator.MetaDataType`.

| **MetaDataType**                     | **.NET Type**          |
| ------------------------------------ | ---------------------- |
| `MetaDataType.DateTime`              | `DateTime`             |
| `MetaDataType.Date`                  | `DateTime`             |
| `MetaDataType.DictionarySingleValue` | `MetaDictionaryItem`   |
| `MetaDataType.EnumSingleValue`       | `MetaDictionaryItem`   |
| `MetaDataType.Float`                 | `double`               |
| `MetaDataType.Decimal`               | `decimal`              |
| `MetaDataType.Money`                 | `decimal`              |
| `MetaDataType.Integer`               | `int`                  |
| `MetaDataType.DictionaryMultiValue`  | `MetaDictionaryItem[]` |
| `MetaDataType.EnumMultiValue`        | `MetaDictionaryItem[]` |
| `MetaDataType.StringDictionary`      | `MetaStringDictionary` |
| `MetaDataType.Boolean`               | `bool`                 |
| `boolMetaDataType.Email`             | `string`               |
| `MetaDataType.URL`                   | `string`               |
| `MetaDataType.ShortString`           | `string`               |
| `MetaDataType.LongString`            | `string`               |
| `MetaDataType.LongHtmlString`        | `string`               |
| `MetaDataType.File`                  | `MetaFile`             |
| `MetaDataType.ImageFile`             | `MetaFile`             |

## Access order metadata

When determining if an object has extended properties, see if the interface derives from `EPiServer.Commerce.Storage.IExtendedProperties`.

```csharp
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
    var contactId = PrincipalInfo.CurrentPrincipal.GetContactId();
    var cart = orderRepository.LoadCart<ICart>(contactId, "Default");
    
    var cartField = cart.Propeties["myfield"].ToString();
    var formField = cart.GetFirstForm().Properties["myFormField"].ToString();
    var paymentField = cart.GetFirstForm().Payments.First().Properties["myPaymentField"].ToString();
    var shipmentField = cart.GetFirstShipment().Properties["myShipmentField"].ToString();
    var lineItemField = cart.GetAllLineItems().First().Properties["myLineItemField"].ToString();
```

## Set order metadata

When determining if an object has extended properties, see if the interface derives from `EPiServer.Commerce.Storage.IExtendedProperties`.

```csharp
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
    var contactId = PrincipalInfo.CurrentPrincipal.GetContactId();
    var cart = orderRepository.LoadCart<ICart>(contactId, "Default");
    
    cart.Propeties["myfield"] = "hello";
    cart.GetFirstForm().Properties["myFormField"] = 23m;
    cart.GetFirstForm().Payments.First().Properties["myPaymentField"] = 11;
    cart.GetFirstShipment().Properties["myShipmentField"] = 9;
    cart.GetAllLineItems().First().Properties["myLineItemField"] = "yes";
```

## Access order metadata \[Legacy]

To access order meta-objects, each order meta-class has a dictionary of meta-fields accessible by the root object.

**Example:** accessing meta-fields from different order meta-fields

```csharp
Cart newCart = OrderContext.Current.GetCart("myname", newCustomer);
    //This is the meta field data access
    string myCartField = newCart["myField"].ToString();
    string orderformField = newCart.OrderForms[0]["myOrderFormField"].ToString();
    string paymentField = newCart.OrderForms[0].Payments[0]["myPaymentField"].ToString();
    string shipmentField = newCart.OrderForms[0].Shipments[0]["myShipmentField"].ToString();
```
