protected object QueryPropertyRecursive(object rootInstance, string[] propertyPath, int piece)
{
string property = propertyPath[piece]; int index;
Type instanceType = rootInstance.GetType();
bool isIndexed = CheckForExistenceAndExtractIndex(ref property, out index);
PropertyInfo propertyInfo = instanceType.GetProperty(property, ResolveFlagsToUse(instanceType));
object instance = null;
if (propertyInfo == null)
{
FieldInfo fieldInfo = instanceType.GetField(property, FieldFlags);
if (fieldInfo != null)
{
instance = fieldInfo.GetValue(rootInstance);
}
}
else
{
if (!propertyInfo.CanRead)
{
throw new BindingException("Property '{0}' for type '{1}' can not be read",
propertyInfo.Name, instanceType.FullName);
}
if (propertyInfo.GetIndexParameters().Length != 0)
{
throw new BindingException("Property '{0}' for type '{1}' has indexes, which are not supported",
propertyInfo.Name, instanceType.FullName);
}
instance = propertyInfo.GetValue(rootInstance, null);
}
if (isIndexed && instance != null)
{
AssertIsValidArray(instance, property, index);
instance = GetArrayElement(instance, index);
}
if (instance == null || piece + 1 == propertyPath.Length)
{
return instance;
}
return QueryPropertyRecursive(instance, propertyPath, piece + 1);
}