Пример #1
0
        public static void AddProperty(
            this TypeBuilder typeBuilder,
            PropertySpecification propertySpec)
        {
            FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertySpec.Name.ToLowerInvariant(), propertySpec.Type, FieldAttributes.Private);

            MethodBuilder getterMethodBuilder;

            if (propertySpec.GetterImplementation != null)
            {
                getterMethodBuilder = propertySpec.GetterImplementation(typeBuilder);
            }
            else
            {
                getterMethodBuilder = CreatePropertyGetMethodWithBackingField(
                    typeBuilder, propertySpec.Name, propertySpec.GetterAttributes, fieldBuilder);
            }

            MethodBuilder setterMethodBuilder = CreatePropertySetMethodWithBackingField(
                typeBuilder, propertySpec.Name, propertySpec.SetterAttributes,
                fieldBuilder);

            if (propertySpec.AnnotateAsCompilerGenerated)
            {
                AddCompilerGeneratedAttribute(getterMethodBuilder);
                AddCompilerGeneratedAttribute(setterMethodBuilder);
            }

            if (typeBuilder.BaseType.GetProperty(propertySpec.Name) != null)
            {
                return;
            }

            var property = typeBuilder.DefineProperty(
                propertySpec.Name, PropertyAttributes.None, propertySpec.Type, null);

            property.SetGetMethod(getterMethodBuilder);
            property.SetSetMethod(setterMethodBuilder);

            foreach (var attributeTemplate in propertySpec.Attributes)
            {
                property.AddAttribute(attributeTemplate);
            }
        }
        public static void AddProperty(
            this TypeBuilder typeBuilder,
            PropertySpecification propertySpec)
        {
            

            FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertySpec.Name.ToLowerInvariant(), propertySpec.Type, FieldAttributes.Private);

            MethodBuilder getterMethodBuilder;
            if (propertySpec.GetterImplementation != null)
            {
                getterMethodBuilder = propertySpec.GetterImplementation(typeBuilder);
            }
            else
            {
                getterMethodBuilder = CreatePropertyGetMethodWithBackingField(
                    typeBuilder, propertySpec.Name, propertySpec.GetterAttributes, fieldBuilder);
            }

            MethodBuilder setterMethodBuilder = CreatePropertySetMethodWithBackingField(
                typeBuilder, propertySpec.Name, propertySpec.SetterAttributes, 
                fieldBuilder);

            if (propertySpec.AnnotateAsCompilerGenerated)
            {
                AddCompilerGeneratedAttribute(getterMethodBuilder);
                AddCompilerGeneratedAttribute(setterMethodBuilder);
            }

            if (typeBuilder.BaseType.GetProperty(propertySpec.Name) != null)
                return;

            var property = typeBuilder.DefineProperty(
                propertySpec.Name, PropertyAttributes.None, propertySpec.Type, null);

            property.SetGetMethod(getterMethodBuilder);
            property.SetSetMethod(setterMethodBuilder);

            foreach (var attributeTemplate in propertySpec.Attributes)
            {
                property.AddAttribute(attributeTemplate);
            }
        }