Exemple #1
0
        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);
        }