/// <summary> /// Creates a <see cref="DmdTypeName"/> /// </summary> /// <param name="type">Type</param> /// <returns></returns> public static DmdTypeName Create(DmdType type) { if (type.TypeSignatureKind == DmdTypeSignatureKind.Type) { var declType = type.DeclaringType; if ((object)declType == null) return new DmdTypeName(type.MetadataNamespace, type.MetadataName); if ((object)declType.DeclaringType == null) return new DmdTypeName(declType.MetadataNamespace, declType.MetadataName, type.MetadataName); var list = ListCache<DmdType>.AllocList(); for (;;) { if ((object)type.DeclaringType == null) break; list.Add(type); type = type.DeclaringType; } var sb = ObjectCache.AllocStringBuilder(); for (int i = list.Count - 1; i >= 0; i--) { if (i != list.Count - 1) sb.Append('+'); sb.Append(list[i].MetadataName); } ListCache<DmdType>.Free(ref list); return new DmdTypeName(type.MetadataNamespace, type.MetadataName, ObjectCache.FreeAndToString(ref sb)); } return new DmdTypeName(null, string.Empty); }
/// <summary> /// Creates a <see cref="DmdTypeName"/> /// </summary> /// <param name="type">Type</param> /// <returns></returns> public static DmdTypeName Create(DmdType type) { if (type.TypeSignatureKind == DmdTypeSignatureKind.Type) { Debug2.Assert(!(type.MetadataName is null)); var declType = type.DeclaringType; if (declType is null) { return(new DmdTypeName(type.MetadataNamespace, type.MetadataName)); } Debug2.Assert(!(declType.MetadataName is null)); if (declType.DeclaringType is null) { return(new DmdTypeName(declType.MetadataNamespace, declType.MetadataName, type.MetadataName)); } List <DmdType>?list = ListCache <DmdType> .AllocList(); for (;;) { if (type.DeclaringType is null) { break; } list.Add(type); type = type.DeclaringType; } Debug2.Assert(!(type.MetadataName is null)); StringBuilder?sb = ObjectCache.AllocStringBuilder(); for (int i = list.Count - 1; i >= 0; i--) { if (i != list.Count - 1) { sb.Append('+'); } sb.Append(list[i].MetadataName); } ListCache <DmdType> .Free(ref list); return(new DmdTypeName(type.MetadataNamespace, type.MetadataName, ObjectCache.FreeAndToString(ref sb))); } return(new DmdTypeName(null, string.Empty)); }