public void Registr(Type IType, Type DType, bool isSingleton)
        {
            if (!IType.IsAssignableFrom(DType) && !IsOpenGenericType(IType))
            {
                return;
            }
            else if (IsOpenGenericType(IType) && IsOpenGenericType(DType))
            {
                if (DType.GetInterface(IType.Name) == null)
                {
                    return;
                }
            }

            DependencyInfo DInfo = new DependencyInfo(IType, DType, isSingleton);

            if (IsOpenGenericType(IType) && IsOpenGenericType(DType))
            {
                DInfo.isOpenGeneric = true;
            }

            if (Config.ContainsKey(IType))
            {
                if (Config[IType].Where(item => item.DependencyType.Equals(DType)).Count() == 0)
                {
                    Config[IType].Add(DInfo);
                }
            }
            else
            {
                Config.Add(IType, new List <DependencyInfo>()
                {
                    DInfo
                });
            }
        }
コード例 #2
0
        public object CreateDependency(Type type, DependencyInfo info)
        {
            object obj = null;

            ConstructorInfo[] constructors = type.GetConstructors();
            constructors = constructors.OrderByDescending(constructor => constructor.GetParameters().Length).
                           Append(typeof(object).GetConstructor(Type.EmptyTypes)).
                           ToArray();

            for (int i = 0; i < constructors.Length; i++)
            {
                ParameterInfo[] parameters        = constructors[i].GetParameters();
                object[]        constructorParams = new object[parameters.Length];
                for (int j = 0; j < parameters.Length; j++)
                {
                    object result;
                    if (parameters[j].ParameterType.IsGenericTypeDefinition)
                    {
                        Type d1          = parameters[j].ParameterType;
                        Type constructed = d1.MakeGenericType(new Type[] { parameters[j].ParameterType.GetGenericArguments()[0] });
                        result = Activator.CreateInstance(constructed);
                    }
                    result = Resolve(parameters[j].ParameterType);
                    constructorParams[j] = result;
                }

                try
                {
                    obj            = Activator.CreateInstance(type, constructorParams);
                    info.isCreated = true;
                    break;
                }
                catch (Exception e) { }
            }
            return(obj);
        }