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); }
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); } }
private void InjectField(object visualizer, IMemberAdapter field, object component) { field.SetValue(visualizer, component); }
public bool IsReader(IMemberAdapter fieldInfo) { return(readers.Contains(fieldInfo.TypeOfMember)); }
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); } }