Crear una instancia de tipos de metadatos personalizados en Apex

Ahora es posible modificar registros de metadatos personalizados en memoria con Apex. Antes, los registros de metadatos personalizados que se consultaban con SOQL en Apex eran inmutables. Los campos de auditoría (CreatedDate, CreatedBy, LastModifiedDate, LastModifiedBy, SystemModStamp) y los campos calculados siguen sin poder modificarse. Las operaciones DML no se permiten en metadatos personalizados en Apex o en las API de socios o compañías. Las operaciones DML pueden realizarse con la API de metadatos de Apex.

Dónde: Este cambio se aplica a las versiones Professional Edition, Enterprise Edition, Performance Edition, Unlimited Edition, Developer Edition y Database.com Edition. Las organizaciones de Professional Edition pueden crear, modificar y eliminar registros de metadatos personalizados únicamente en tipos de paquetes instalados.

Cómo: En este ejemplo, el primer método está creando una instancia de un registro de metadatos personalizado, pero no se está insertando ningún registro en la memoria. El segundo método recupera un registro, lo modifica y lo devuelve al emisor; sin embargo, el cambio no se actualiza en la base de datos.
public class CustomMetadataService {

    public CustomMetadataService() {}

    /**
     * This method instantiates a custom metadata record of type MyCustomMetadataType__mdt
     * and sets the DeveloperName to the input String.
     * Note that the record is not inserted into the database, 
     * and would not be found by a SOQL query.
     */
    public MyCustomMetadataType__mdt getCustomMetadataRecord(String myName) {
        MyCustomMetadataType__mdt theRecord = new MyCustomMetadataType__mdt();
        theRecord.DeveloperName = myName;
        return theRecord;
    }

    /**
     * This method retrieves a custom metadata record, changes a field, and returns it
     * to the caller. Note that the changed record is not updated in the database.
     */
    public MyCustomMetadataType__mdt getChangedCustomMetadataRecord(String myNewName) {
        MyCustomMetadataType__mdt theRecord = [SELECT Id, DeveloperName from MyCustomMetadataType__mdt LIMIT 1];
        theRecord.DeveloperName = myNewName;
        return theRecord;
    }

}