コード例 #1
0
        public IMemberAdapter GetAdapterForType(Type targetType, Type typeOfInjectee)
        {
            RegisterType(targetType);
            var            cache = memberInjectionCache[targetType];
            IMemberAdapter memberToInjectInto = null;

            if (cache == null || cache.TryGetValue(typeOfInjectee, out memberToInjectInto))
            {
                return(memberToInjectInto);
            }

            var injectableMembers = injectableMembersCache[targetType];

            for (int i = 0; i < injectableMembers.Count; i++)
            {
                if (injectableMembers[i].TypeOfMember.IsAssignableFrom(typeOfInjectee))
                {
                    memberToInjectInto = injectableMembers[i];
                    break;
                }
            }

            cache.Add(typeOfInjectee, memberToInjectInto);
            return(memberToInjectInto);
        }
コード例 #2
0
        private void CacheReadersAndWriters(HashSet <Type> requiredTypesSeen, IMemberAdapter requiredMember)
        {
            if (requiredTypesSeen.Contains(requiredMember.TypeOfMember))
            {
                return;
            }

            requiredTypesSeen.Add(requiredMember.TypeOfMember);
            if (Attribute.IsDefined(requiredMember.TypeOfMember, typeof(WriterInterfaceAttribute), false))
            {
                writers.Add(requiredMember.TypeOfMember);
            }

            if (Attribute.IsDefined(requiredMember.TypeOfMember, typeof(ReaderInterfaceAttribute), false))
            {
                readers.Add(requiredMember.TypeOfMember);
            }
        }
コード例 #3
0
 private void InjectField(object visualizer, IMemberAdapter field, object component)
 {
     field.SetValue(visualizer, component);
 }
コード例 #4
0
 public bool IsReader(IMemberAdapter fieldInfo)
 {
     return(readers.Contains(fieldInfo.TypeOfMember));
 }
コード例 #5
0
        private void InitializeMetadataForMember(HashSet <Type> requiredTypesSeen, Type type, IMemberAdapter requiredMember, List <IMemberAdapter> requiredReadersWriters, List <IMemberAdapter> requiredWriters, List <uint> readersStateIds)
        {
            CacheReadersAndWriters(requiredTypesSeen, requiredMember);

            if (IsWriter(requiredMember))
            {
                requiredReadersWriters.Add(requiredMember);
                requiredWriters.Add(requiredMember);
            }
            else if (IsReader(requiredMember))
            {
                requiredReadersWriters.Add(requiredMember);
                var canonicalNameAttribute = Attribute.GetCustomAttribute(requiredMember.TypeOfMember, typeof(ComponentIdAttribute), false);
                if (canonicalNameAttribute != null)
                {
                    readersStateIds.Add(((ComponentIdAttribute)canonicalNameAttribute).Id);
                }
                else
                {
                    Debug.LogErrorFormat("Could not find state metadata for Reader {0}. This might cause issues with the state not being synchronised to the worker.", requiredMember.TypeOfMember.FullName);
                }
            }
            else
            {
                visualizersWithNonInjectableRequiredFields.Add(type);
                Debug.LogErrorFormat("The [Require] attribute can only be used on state Readers and Writers. {0} {1} is not one of those in visualizer {2}. The visualizer won't be enabled.",
                                     requiredMember.TypeOfMember.FullName, requiredMember.Member.Name, type.FullName);
            }
        }