code: def resolve_spec_identifier(self, obj_name):
          
          ref = self.references.get(obj_name)
          if ref is None:
              return obj_name
  
          resolved = ref.get("fullName", obj_name)
          spec = ref.get("spec.csharp", [])
          parts = []
          for part in spec:
              if part.get("name") == "<":
                  parts.append("{")
              elif part.get("name") == ">":
                  parts.append("}")
              elif "fullName" in part and "uid" in part:
                  parts.append("{fullName}<{uid}>".format(**part))
              elif "uid" in part:
                  parts.append(part["uid"])
              elif "fullName" in part:
                  parts.append(part["fullName"])
          if parts:
              resolved = "".join(parts)
          return resolved
docs: Find reference name based on spec identifier
  
          Spec identifiers are used in parameter and return type definitions, but
          should be a user-friendly version instead. Use docfx ``references``
          lookup mapping for resolution.
  
          If the spec identifier reference has a ``spec.csharp`` key, this implies
          a compound reference that should be linked in a special way. Resolve to
          a nested reference, with the corrected nodes.
  
          .. note::
              This uses a special format that is interpreted by the domain for
              parameter type and return type fields.
  
          :param obj_name: spec identifier to resolve to a correct reference
          :returns: resolved string with one or more references
          :rtype: str