Example #1
0
        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;
        }