Yes, sure, but you need firstly check for field type, for example:
private static Boolean isFieldTypeString(DisplayType fieldType) {
if (fieldType == DisplayType.EMAIL
|| fieldType == DisplayType.STRING
|| fieldType == DisplayType.PHONE
|| fieldType == DisplayType.PICKLIST
|| fieldType == DisplayType.TEXTAREA
|| fieldType == DisplayType.REFERENCE
|| fieldType == DisplayType.ID
|| fieldType == DisplayType.URL) {
return true;
}
return false;
}
And only then assign the value (your keyValue
map should be Map<String, Object>
):
public static void enqueueUpdate(Id sObjectId, Map<String, Object> keyValue) {
SObject toUpdate = sObjectId.getSObjectType().newSObject(sObjectId);
for (SObjectField field_i : toUpdate.getSObjectType().getDescribe().fields.getMap().values()) {
if (!field_i.getDescribe().isUpdateable()) {
continue;
}
String fieldName_i = field_i.getDescribe().name;
DisplayType fieldType_i = field_i.getDescribe().type;
Object valueToCheck = keyValue.get(fieldName_i);
if (valueToCheck == null) {
continue;
}
if (isFieldTypeString(fieldType_i)) {
toUpdate.put(fieldName_i, (String) valueToCheck);
} else if (isFieldTypeDecimal(fieldType_i)) {
toUpdate.put(fieldName_i, (Decimal) valueToCheck);
} else if (isFieldTypeBoolean(fieldType_i)) {
//...
} else if (fieldType_i == DisplayType.DATE) {
//...
} else if (fieldType_i == DisplayType.DATETIME) {
//...
}
}
sObjectsToUpdate.add(toUpdate);
}
Now you should only implement methods like isFieldTypeString
:
isFieldTypeDecimal
isFieldTypeBoolean