Example #1
0
        protected FieldBuilder GetField()
        {
            var propertyInfo = Context.CurrentProperty;
            var fieldName    = GetFieldName();
            var fieldType    = GetFieldType();
            var field        = Context.GetField(fieldName);

            if (field == null)
            {
                Debug.Assert(propertyInfo != null, nameof(propertyInfo) + " != null");

                field = Context.CreatePrivateField(propertyInfo, fieldName, fieldType);

                if (TypeAccessor.IsInstanceBuildable(fieldType))
                {
                    var noInstance = propertyInfo.GetCustomAttributes(typeof(NoInstanceAttribute), true).Length > 0;

                    if (IsObjectHolder && noInstance)
                    {
                        BuildHolderInstance(Context.TypeBuilder.DefaultConstructor.Emitter);
                        BuildHolderInstance(Context.TypeBuilder.InitConstructor.Emitter);
                    }
                    else if (!noInstance)
                    {
                        if (fieldType.IsClass && IsLazyInstance(fieldType))
                        {
                            BuildLazyInstanceEnsurer();
                        }
                        else
                        {
                            BuildDefaultInstance();
                            BuildInitContextInstance();
                        }
                    }
                }
            }

            return(field);
        }