<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def resolve_spec_identifier(self, obj_name):
 """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 """

        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