示例#1
0
		/// <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);
		}
示例#2
0
        /// <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));
        }