コード例 #1
0
        public static void BuildResource(object resource, HttpRequestMessage request)
        {
            IEnumerable enumerable = resource as IEnumerable; //Com cast silencioso
            Type        dtoType;

            if (enumerable == null)
            {//é um objeto quando se é nulo
                dtoType = resource.GetType();
            }
            else
            {
                dtoType = resource.GetType().GetGenericArguments()[0];
            }

            if (dtoType.BaseType != typeof(RestResource))
            { // Se não estiver herdando RestResource
                throw new ArgumentException($"Era esperado um RestResource, porém, foi informado {resource.GetType().FullName}");
            }

            Assembly currentAssembly = Assembly.GetExecutingAssembly();                                                                                                                                  //Pega o assembly atual
            //Criar instância de maneira dinâmica
            IResourceBuilder resourceBuilder = (IResourceBuilder)Activator.CreateInstance(currentAssembly.GetType($"Empresa.MinhaApi.Api.HATEOAS.ResourceBuilders.Impl.{dtoType.Name}ResourceBuilder")); //Todos os builders ficarão na mesma namespace e terminar com 'ResourceBuilder'

            if (enumerable == null)
            { // É um objeto
                resourceBuilder.BuildResouce(resource, request);
            }
            else   // é uma lista
            {
                foreach (var item in enumerable)
                {
                    resourceBuilder.BuildResouce(item, request);
                }
            }
        }