Instancie tipos de metadados personalizados no Apex

Agora você pode editar registros de metadados personalizados na memória no Apex. Anteriormente, registros de metadados personalizados consultados com SOQL no Apex eram imutáveis. Campos de auditoria (CreatedDate, CreatedBy, LastModifiedDate, LastModifiedBy, SystemModStamp) e campos calculados permanecem não editáveis. As operações de DML não são permitidas em metadados personalizados no Apex ou nas APIs empresariais ou do parceiro. As operações de DML podem ser feitas com a API de metadados do Apex.

Onde: Essa alteração se aplica às edições Professional, Enterprise, Performance, Unlimited e Database.com. As organizações da Professional Edition podem criar, editar e excluir somente registros de metadados personalizados somente em tipos de pacotes instalados.

Como: Neste exemplo, o primeiro método está instanciando um registro de metadados personalizado, mas nenhum registro foi inserido na memória. O segundo método recupera um registro, altera-o e retorna-o ao chamador, mas a alteração não é atualizada no banco de dados.
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;
    }

}