示例#1
0
        public void TestDynamicTypeBuilder()
        {
            var descriptor = new DynamicTypeDescriptorBuilder()
                             .HasName("SomeDynamicType")
                             .AddProperty <int>("A", config => config
                                                .HasAttribute(() => new TestPropertyAttribute("name", "value"))
                                                );

            var type = DynamicTypeBuilder.Instance.CreateType(descriptor);


            var ctor = Expression.Lambda <Func <object[], object> >(Expression.New(type.GetConstructor(Type.EmptyTypes)), Expression.Parameter(typeof(object[]))).Compile();
            var o    = ctor(new object[] { });
        }
示例#2
0
        private Type BuildProjectedType()
        {
            if (configuration.CtorParameters.Any())
            {
                throw new InvalidOperationException("Cannot build projected type with explicit constructor parameter mapping");
            }

            var typeBuilder = new DynamicTypeDescriptorBuilder(configuration.ProjectedTypeName);

            foreach (var member in configuration.Members)
            {
                typeBuilder.AddProperty(
                    member.ProjectedMember.GetName(),
                    //overriden type
                    member.AsType ??
                    //specified member type
                    member.ProjectedMember.GetMemberType() ??
                    //auto
                    (member.Source == null ?
                     GetMemberInfoType(
                         configuration.SourceType.GetMember(
                             GetSourceMemberNameFromMemberName(
                                 member.ProjectedMember.GetName())).First()) :
                     //expression
                     GetExpression(member.Source, configuration.It)?.Type) ??
                    //fallback
                    typeof(object),
                    config =>
                {
                    if (member.ProjectionTarget == ProjectionTarget.CtorParameter)
                    {
                        config.IsInitializedInConstructorOptional(member.CtorParameterName);
                    }

                    config.AsNullable(member.AsNullable);
                });
            }

            return(DynamicTypeBuilder.Instance.CreateType(typeBuilder));
        }
示例#3
0
        private static Type BuildKeyValueType(Type entityType, List <PropertyInfo> keyProperties)
        {
            var dynamicTypeBuilderDescriptor =
                new DynamicTypeDescriptorBuilder("_" + entityType.FullName + CLASS_NAME_SUFFIX)
                .HasBaseType <DomainKeyValue>();

            keyProperties
            .ForEach(x =>
            {
                dynamicTypeBuilderDescriptor.AddProperty(
                    x.Name,
                    x.PropertyType,
                    config => config
                    .HasSetter(GetSetAccessModifier.None)
                    .IsInitializedInConstructor()
                    );
            });

            var keyValueType = DynamicTypeBuilder.Instance.CreateType(dynamicTypeBuilderDescriptor);

            return(keyValueType);
        }