コード例 #1
0
        /// <summary>
        /// CTOR - from builder
        /// </summary>
        /// <param name="builder">Builder</param>
        public TypeMember(TypeMemberBuilder builder) : base(builder)
        {
            TypeKind              = builder.TypeKind;
            TypeRef               = builder.TypeRef;
            IsGeneric             = builder.IsGeneric;
            TypeParameters        = builder.TypeParameters;
            DelegateParameters    = builder.DelegateParameters;
            DelegateReturnType    = builder.DelegateReturnType;
            InterfacesTypeRefs    = builder.InterfacesTypeRefs;
            AllInterfacesTypeRefs = builder.AllInterfacesTypeRefs;
            InterfaceImplementationsByInterfaceMember = builder.InterfaceImplementationsByInterfaceMember;
            InterfaceMembersByInterfaceImplementation = builder.InterfaceMembersByInterfaceImplementation;

            var members = new List <Member>();

            foreach (var typeContentBuilder in builder.ContentMembers)
            {
                typeContentBuilder.Root      = builder.Root;
                typeContentBuilder.Assembly  = builder.Assembly;
                typeContentBuilder.Namespace = builder.Namespace;
                typeContentBuilder.Type      = this;

                TypeContentMember m = null;
                switch (typeContentBuilder)
                {
                case FieldMemberBuilder fieldBuilder:
                    m = new FieldMember(fieldBuilder);
                    break;

                case PropertyMemberBuilder propertyBuilder:
                    m = new PropertyMember(propertyBuilder);
                    break;

                case MethodMemberBuilder methodBuilder:
                    m = new MethodMember(methodBuilder);
                    break;

                case EventMemberBuilder eventBuilder:
                    m = new EventMember(eventBuilder);
                    break;
                }

                members.Add(m);
            }

            if (AllMembers is List <Member> allMembers)
            {
                allMembers.AddRange(members);
            }
        }
コード例 #2
0
        private TypeMember ReadAndRegisterMember(Type clrType, int distance)
        {
            var builder = new TypeMemberBuilder();
            var reader  = new ClrTypeReader(clrType, builder, resolver: this, distance);

            _typeMemberByClrType.Add(clrType, builder.GetTemporaryProxy().GetRef());

            if (distance == 0)
            {
                reader.ReadAll();
            }
            else
            {
                reader.ReadNameOnly();
            }

            var finalMember = new RealTypeMember(builder);

            builder.GetMemberSelfReference().Reassign(finalMember);

            return(finalMember);
        }
コード例 #3
0
            public static TypeMember BuildType(TypeMemberKind typeKind, string name, Action body)
            {
                var context           = GetContextOrThrow();
                var modifiers         = context.PopStateOrThrow <MemberModifierState>();
                var namespaceState    = context.TryLookupState <NamespaceState>();
                var containingTypeRef = context.TryLookupState <MemberRef <TypeMember> >();

                var builder = new TypeMemberBuilder();

                builder.Namespace     = namespaceState?.Name;
                builder.Name          = name;
                builder.TypeKind      = typeKind;
                builder.DeclaringType = containingTypeRef;

                using (context.PushState(builder.UnderlyingType))
                {
                    body?.Invoke();
                }

                var finalMember = new RealTypeMember(builder);

                builder.GetMemberSelfReference().Reassign(finalMember);
                return(finalMember);
            }