function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Bruno Mendes 19Bruno Mendes 19 

Is it possible to cast an sObject to another object that is dynamic?

I'm having a problem with my code because I need to get a list of records of a dynamic type, and that is working alright, but then I need to use some of the fields and can't reach them, giving me the error 'Variable does not exist".
Here is a sample of the code:
String queryString = 'select Id, '+ camposMainObj.get(0) +', '+ camposMainObj.get(1)+', '+ camposMainObj.get(2) +', test__c from ' +sObjName+ ' where Id = \''+recordId+'\'';
 List<sObject> obj = database.query(queryString); system.debug('sObjName ::::::::: '+obj);
 string listType = 'List<'+sObjName+'>';
 List<sObject> castRecords = (List<sObject>)Type.forName(listType).newInstance();
 castRecords.addAll(obj);
 system.debug(castRecords);
 ChartObject__c co = new ChartObject__c();
 co.Pai__c = castRecords[0].Id;
co.PaiName__c = castRecords[0].Name;
 co.PaiEmail__c = castRecords[0].Email__c;
 co.PaiPhone__c = castRecords[0].Phone__c;


The variable 'sObjName' contains the correct object type (in this case Pai__c).
Only the Id is recognized. The result query looks like this:
(Pai__c:{Id=a070O00001uWD58QAG, Name=pai1, Phone__c=910987654, Email__c=pai1@mail.com, test__c=asdf}

So I can get every field from the query, but can only get the Id on the new object and it matches the queried one. The Name, Phone__c, Email__c, etc give me that error. I tried many solutions but can't seem to make it work.

Any help is appreciated.

Thank you in advance.
Best Answer chosen by Bruno Mendes 19
NagendraNagendra (Salesforce Developers) 
Hi Bruno,

Apex requires types to be known at compile time to directly reference fields.

But there are are get methods in the SObject class for this case where the field names can be used in string form:
List<sObject> objects = database.query(queryString);
for (sObject o : objects) {
    String name = (String) o.get(camposMainObj.get(0));
    String email = (String) o.get(camposMainObj.get(1));
    String phone = (String) o.get(camposMainObj.get(2));
    ...
}
but it is up to you to cast to the correct type as the return value of get is Object.

Hope this helps.

Kindly mark this as solved if the information helps.

Thanks,
Nagendra