private Type TryMapTypeToTargetAssemblyType(SR.Assembly targetAssembly, Type type, string typeName = null) { typeName = !String.IsNullOrEmpty(typeName) ? typeName : type.GetNormalizedName(); var genArgs = type.GetGenericArguments(); foreach (var inj in _classInjectees.Where(i => i is TypeTargetInjecteeBase).Cast<TypeTargetInjecteeBase>()) { var injName = inj.InjecteeType.GetNormalizedName(); var targName = inj.TargetType.GetNormalizedName(); if (injName != typeName && targName != typeName) continue; var mapType = inj.TargetType; var tGenArgs = mapType.GetGenericArguments(); if (tGenArgs.Length != genArgs.Length) continue; if (type.IsConstructedGenericType && mapType.IsGenericTypeDefinition) { // Create generic type from generic definition var args = new List<Type>(genArgs.Length); for (int i = 0; i < genArgs.Length; i++) { if (genArgs[i].IsGenericParameter) { args.Add(tGenArgs[i]); } else { var mappedGa = TryMapTypeToTargetAssemblyType(targetAssembly, genArgs[i]); args.Add(mappedGa != null ? mappedGa : genArgs[i]); } } mapType = mapType.GetGenericTypeDefinition().MakeGenericType(args.ToArray()); } return mapType; } return null; }
public static bool TypeMatches(this TypeReference type, Type matches) { if (type.GetNormalizedName() != matches.GetNormalizedName()) return false; if (type.IsGenericParameter != type.IsGenericParameter) return false; if (type.IsGenericParameter) return true; var matchPars = matches.GetGenericArguments(); if (type.Resolve().GenericParameters.Count != matchPars.Length) return false; if (type.IsGenericInstance && matches.IsConstructedGenericType) { var genInst = (GenericInstanceType)type; var genArgs = genInst.GenericArguments; for (int i = 0; i < genArgs.Count; i++) { if (!genArgs[i].TypeMatches(matchPars[i])) return false; } } return true; }