GlueViewOfficialPlugins.Scripting.ExpressionParser.GetObjectFromContainerAndNameReference C# (CSharp) Method

GetObjectFromContainerAndNameReference() private static method

private static GetObjectFromContainerAndNameReference ( object container, string memberName, CodeContext codeContext, object &foundValue, bool &wasFound ) : void
container object
memberName string
codeContext GlueView.Scripting.CodeContext
foundValue object
wasFound bool
return void
        private static void GetObjectFromContainerAndNameReference(object container, string memberName, CodeContext codeContext, 
            ref object foundValue, ref bool wasFound)
        {
            object originalContainer = container;

            if (container == null)
            {
                int stackDepth = -1;
                codeContext.GetVariableInformation(memberName, out stackDepth);

                if (stackDepth != -1)
                {
                    StackVariableReference reference = new StackVariableReference();
                    reference.StackIndex = stackDepth;
                    reference.VariableName = memberName;
                    reference.CodeContext = codeContext;

                    foundValue = reference;
                    wasFound = foundValue != null;
                }
            }
            else
            {
                
                Type typeToGetFrom = null;

                if (container is IAssignableReference)
                {
                    container = ((IAssignableReference)container).CurrentValue;
                }

                if (container is Type)
                {
                    typeToGetFrom = container as Type;
                }
                else if (container != null)
                {
                    typeToGetFrom = container.GetType();
                }

                AssignableReference assignableReference = null;

                var fieldInfo = typeToGetFrom.GetField(memberName);
                if (fieldInfo != null)
                {
                    assignableReference = new AssignableReference();
                    assignableReference.FieldInfo = fieldInfo;
                    assignableReference.Owner = container;

                    if (originalContainer is IAssignableReference)
                    {
                        assignableReference.Parent = originalContainer as IAssignableReference;
                    }
                }
                else
                {
                    var propertyInfo = typeToGetFrom.GetProperty(memberName);
                    if (propertyInfo != null)
                    {
                        assignableReference = new AssignableReference();
                        assignableReference.PropertyInfo = propertyInfo;
                        assignableReference.Owner = container;

                        if (originalContainer is IAssignableReference)
                        {
                            assignableReference.Parent = originalContainer as IAssignableReference;
                        }
                    }
                }

                foundValue = assignableReference;
                wasFound = foundValue != null;
            }
        }