public object Evaluate() { object current = null; for (var i = 0; i < Length; i++) { switch (chainTypes[i]) { case ReferenceType.GameObject: case ReferenceType.Component: current = chainObjects[i]; break; case ReferenceType.Field: current = ((FieldInfo)chainObjects[i]).GetValue(current); break; case ReferenceType.Property: current = ((PropertyInfo)chainObjects[i]).GetValue(current, null); break; case ReferenceType.Method: break; case ReferenceType.EnumerableItem: var collection = current as IEnumerable; uint itemCount = 0; foreach (var item in collection) { if (itemCount == (uint)chainObjects[i]) { current = item; break; } itemCount++; } break; case ReferenceType.SpecialNamedProperty when current is Material material: current = ShaderUtil.GetProperty(material, (string)chainObjects[i]); break; default: Logger.Error($"unhandled case in refchain: " + $"index={i} target=\"{current}\" ReferenceType=\"{chainTypes[i]}\""); break; } } return(current); }