Have you ever wanted to create an SObject in memory, and write to one or more fields that are normally unwriteable? For instance, CreatedDate, or a formula field. You might want to do this in a unit test class. Or you might have a formula field in an SObject held by a VisualForce controller that you want to update before committing to the database. Normally, Apex won’t let you do that. Here’s a workaround.

public static SObject makeSObjectFromFields(Map<String, String>fields, System.Type targetType) {
    String jsonrep = json.serialize(fields);
    return (SObject)json.deserialize(jsonrep, targetType);
}

Here’s an example of calling that method:

OpportunityLineItem oli = (OpportunityLineItem)SchemaUtility.makeSObjectFromFields(
    new Map<String,String>{
        'ListPrice' => String.valueOf(pbe.UnitPrice)
    },
    opportunityLineItem.class
);
Written on