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;
}
}