Para seguir con la idea de Hector (sin meterse a los abismos de RTTI) podes declarar directamente un vector sobre el tipo enumerado:
Código Delphi
[-]
function StateToStr(AState: TDataSetState): string;
const StateDesc:array[dsInactive..dsOpening] of String =
('dsInactive', 'dsBrowse', 'dsEdit',
'dsInsert', 'dsSetKey', 'dsCalcFields', 'dsFilter', 'dsNewValue', 'dsOldValue',
'dsCurValue', 'dsBlockRead', 'dsInternalCalc', 'dsOpening');
begin
Result := StateDesc[AState];
end;
Puede que no compile, pues no lo he probado, pero dejo la idea.
Hasta luego.