Exemplo n.º 1
0
        public GeneratedType BuildType(GeneratedAssembly assembly)
        {
            var typeName = _style.ToString() + _mapping.DocumentType.ToSuffixedTypeName("Selector");

            var baseType = determineBaseType();

            var type          = assembly.AddType(typeName, baseType);
            var interfaceType = typeof(ISelector <>).MakeGenericType(_mapping.DocumentType);

            type.Implements(interfaceType);

            var sync  = type.MethodFor("Resolve");
            var async = type.MethodFor("ResolveAsync");

            var table   = _mapping.Schema.Table;
            var columns = table.SelectColumns(_style);

            for (var i = 0; i < columns.Length; i++)
            {
                columns[i].GenerateCode(_style, type, async, sync, i, _mapping);
            }

            generateIdentityMapAndTrackingCode(sync, async, _style);

            sync.Frames.Return(_mapping.DocumentType);
            if (async.Frames.Any(x => x.IsAsync))
            {
                async.Frames.Return(_mapping.DocumentType);
            }
            else
            {
                async.Frames.Code($"return {typeof(Task).FullNameInCode()}.FromResult(document);");
            }

            return(type);
        }