AgentMulder.Containers.Autofac.Patterns.RegisterLambdaExpression.GetRegistrationsFromExpression C# (CSharp) Method

GetRegistrationsFromExpression() private method

private GetRegistrationsFromExpression ( ITreeNode registrationRootElement, ICSharpExpression expression ) : IEnumerable
registrationRootElement ITreeNode
expression ICSharpExpression
return IEnumerable
        private IEnumerable<IComponentRegistration> GetRegistrationsFromExpression(ITreeNode registrationRootElement, ICSharpExpression expression)
        {
            var castExpression = expression as ICastExpression;
            if (castExpression != null)
            {
                var predefinedTypeUsage = castExpression.TargetType as IUserTypeUsage;
                if (predefinedTypeUsage != null && predefinedTypeUsage.ScalarTypeName != null)
                {
                    IResolveResult resolveResult = predefinedTypeUsage.ScalarTypeName.Reference.Resolve().Result;
                    var typeElement = resolveResult.DeclaredElement as ITypeElement;
                    if (typeElement != null)
                    {
                        yield return new ServiceRegistration(registrationRootElement, typeElement);
                    }
                }
            }

            var asExpression = expression as IAsExpression;
            if (asExpression != null)
            {
                var typeUsage = asExpression.TypeOperand as IUserTypeUsage;
                if (typeUsage != null && typeUsage.ScalarTypeName != null)
                {
                    IResolveResult resolveResult = typeUsage.ScalarTypeName.Reference.Resolve().Result;
                    var typeElement = resolveResult.DeclaredElement as ITypeElement;
                    if (typeElement != null)
                    {
                        yield return new ServiceRegistration(registrationRootElement, typeElement);
                    }
                }
            }

            var objectCreationExpression = expression as IObjectCreationExpression;
            if (objectCreationExpression != null && objectCreationExpression.TypeReference != null)
            {
                IResolveResult resolveResult = objectCreationExpression.TypeReference.Resolve().Result;

                var @class = resolveResult.DeclaredElement as IClass;
                if (@class != null)
                {
                    yield return new ComponentRegistration(registrationRootElement, @class, @class);
                }
            }

            var invocationExpression = expression as IInvocationExpression;
            if (invocationExpression != null)
            {
                if (invocationExpression.Reference != null)
                {
                    var result = invocationExpression.Reference.Resolve().Result.DeclaredElement as IParametersOwner;
                    if (result != null)
                    {
                        var type = result.ReturnType as IDeclaredType;
                        if (type != null)
                        {
                            var @class = type.GetTypeElement();
                            if (@class != null)
                            {
                                yield return new ComponentRegistration(registrationRootElement, @class, @class);
                            }
                        }
                    }
                }
            }
        }