/// <summary> /// Finds the specified identifier. /// </summary> /// <param name="typeId">The identifier.</param> /// <param name="args">The arguments.</param> /// <param name="types">The types.</param> /// <returns></returns> public IEnumerable <IRuntimeType> FindRuntimeTypes(string typeId, IEnumerable <string> args, IEnumerable <IRuntimeType> types) { var id = Regex.Replace(typeId, @"\s", ""); var func = Regex.Match(id, @"([^()]+)(?:\((.*)\)){0,1}$"); var constructor = id == func.Groups[1].Value ? Format.GetConstructor(id, args) : id; var cached = Cache.Where((p) => p.Value == constructor).Select((p) => p.Key); var cachedCount = cached.Count(); if (cachedCount > 0) { return(cached); } var count = types.Count(); if (count > 0) { var name = func.Groups[1].Value; var pars = Regex.Matches(func.Groups[2].Value, @"([^,]+\(.+?\))|([^,]+)"); IRuntimeType CacheRuntimeType(IRuntimeType runtimeType) { if (!Cache.ContainsKey(runtimeType)) { Cache.Add(runtimeType, constructor); } return(runtimeType); } return(types.Where((p) => p.MatchParameters(name, args, pars)).Select(CacheRuntimeType)); } return(new IRuntimeType[0]); }
/// <summary> /// Finds all dependency runtime types with full parameters specified /// </summary> /// <param name="runtimeTypes"></param> /// <param name="typeId"></param> /// <returns></returns> public static IRuntimeType[] FindRuntimeTypes(this IEnumerable <IRuntimeType> runtimeTypes, string typeId) => runtimeTypes.Where((p) => typeId == Format.GetConstructor(p.TypeFullName, p.RuntimeTypes.Select((s) => s.TypeFullName))).ToArray();