Help macro for safe navigate dynamics using runtime string

I am try to make possible and safe to navigate dynamics using runtime strings,
The first is working, second not.

		var a:Dynamic = {

				b: {
					c: 123
				}

		};
    var aaa=safeget(a.b.c);
    trace(aaa);
    aaa=safeget(a["b"].c);
    trace(aaa);

Error

 14 |     aaa=safeget(a["b"].c);
    |                   ^^^
    | String should be Int

Live example, and macro code;

var getexpr = switch expr.expr {
    case EField(e, f):{
      //var safe_e=safeget(e);
      macro $e?.$f;
  }
    case EArray(e1,e2):{
            macro $e1==null ? null : Reflect.field($e1,$e2);
    }
    ```