public static MemberInfo[] FieldsAndPropertiesOf(Type type) { if (type == null) { throw new ArgumentNullException("Cannot get fields and properties of null type!"); } lock (String.Intern($"ACCESS_MEMBER_CACHE_{type.Name}")) { if (!MembersCache.ContainsKey(type)) { MembersCache[type] = CollectMembers(type).ToArray(); } // It is not clear rather the .Net Runtime caches or not // the member info or if they do lookups all the time // It could be good to cache this, but I'm not sure yet. return(MembersCache[type]); } }
internal static IMemberDefinition GetMember(string assemblyFilePath, uint moduleToken, uint typeToken, uint memberToken, SupportedLanguage language) { MembersCacheKey key = new MembersCacheKey() { AssemblyFilePath = assemblyFilePath, ModuleToken = moduleToken, TypeToken = typeToken, MemberToken = memberToken }; IMemberDefinition result; if (!MembersCache.TryGetValue(key, out result)) { TypeDefinition type = GetTypeDefinition(assemblyFilePath, moduleToken, typeToken); IEnumerable <IMemberDefinition> typeMembers = type.GetMembersSorted(true, GetLanguage(language)); result = typeMembers.Where(x => x.MetadataToken.ToUInt32() == memberToken).FirstOrDefault(); MembersCache.Add(key, result); } return(result); }