private static MethodInfo GetMethodInfo(Type type, string methodName, IEnumerable <object> parameters) { var parametersType = parameters.Select(p => p.GetType()).ToArray(); var parametersTypeName = parametersType.Select(p => p.Name).Join("/"); var key = new MemberKey(type, string.Concat(methodName, parametersTypeName)); lock (lockInstance) { if (!typeMethodInfoCache.ContainsKey(key)) { var methodInfo = type.GetMethod( methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new[] { typeof(string) }, null); if (methodInfo == null) { var message = $"Cannot find the method '{methodName}' into the type '{type}'."; throw new ArgumentException(message); } typeMethodInfoCache.Add(key, methodInfo); } } var method = typeMethodInfoCache[key]; return(method); }
public static FieldInfo Field(this Type type, string propertyName) { var key = new MemberKey(type, propertyName); lock (lockInstance) { if (!typeFieldInfoCache.ContainsKey(key)) { var cachedField = GetFieldByPropertyName(type, propertyName); typeFieldInfoCache.Add(key, cachedField); } } var field = typeFieldInfoCache[key]; return(field); }
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); }