private void SetInfo(Type type, string name, Func <string> fullName, string @namespace) { RealType = type; Accessibility = type.ConvertAccessibilityInfo(); IsStatic = type.IsAbstract && type.IsSealed; Name = name; Namespace = @namespace; baseType = new Lazy <ITypeSymbolInfo>(() => RealType.BaseType?.GetSymbolInfo()); if (type.IsGenericType) { TypeArguments = EnumerableExtensions.CreateLazyImmutableArray(() => type.GenericTypeArguments.Select(i => i.GetSymbolInfo())); TypeParameters = EnumerableExtensions.CreateLazyImmutableArray <ITypeParameterSymbolInfo>(() => (type.IsGenericTypeDefinition ? type : type.GetGenericTypeDefinition()).GetGenericArguments().Select(i => new TypeParameterSymbolInfo(i))); Func <IEnumerable <ITypeSymbolInfo> > genericParams = () => type.IsGenericTypeDefinition ? TypeParameters.Cast <ITypeSymbolInfo>() : TypeArguments; Name = genericParamsNumber.Replace(name, string.Empty); Func <string> newFullName = () => genericParamsNumber.Replace($"{(type.IsNested ? type.DeclaringType.GetSymbolInfo().FullName : Namespace)}.{Name}", string.Empty); genericDefinitionName = new Lazy <string>(() => $"{newFullName()}<{genericParams().Select(i => string.Empty).InsertSeparator(",").Aggregate((i, j) => i + j)}>"); fullName = () => $"{newFullName()}<{genericParams().Select(i => i.FullName).InsertSeparator(",").Aggregate((i, j) => i + j)}>"; } else { genericDefinitionName = new Lazy <string>(() => string.Empty); TypeArguments = EnumerableExtensions.EmptyImmutableArray <ITypeSymbolInfo>(); TypeParameters = EnumerableExtensions.EmptyImmutableArray <ITypeParameterSymbolInfo>(); } this.fullName = new Lazy <string>(fullName); Attributes = EnumerableExtensions.CreateLazyImmutableArray <IAttributeSymbolInfo>(() => RealType.GetCustomAttributesData().Select(i => new AttributeSymbolInfo(i))); Interfaces = EnumerableExtensions.CreateLazyImmutableArray(() => RealType.GetInterfaces().Distinct().Select(i => i.GetSymbolInfo())); Members = EnumerableExtensions.CreateLazyImmutableArray(() => RealType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) .Select(RuntimeSymbolExtensions.ConvertToStructure) .Where(i => i != null)); isAnonymousType = new Lazy <bool>(() => Attribute.IsDefined(RealType, typeof(CompilerGeneratedAttribute), false) && RealType.Name.Contains("AnonymousType") && RealType.Name.StartsWith("<>")); }