1 interface ImContainer 2 { 3 void RegisterType<TForm, TTo>() where TTo : TForm; 4 5 TForm Resolve<TForm>(); 6 }
1 class mContainer : ImContainer 2 { 3 private Dictionary<string, Type> keyValuePairs = new Dictionary<string, Type>(); 4 public void RegisterType<TForm, TTo>() where TTo : TForm 5 { 6 keyValuePairs.Add(typeof(TForm).FullName, typeof(TTo)); 7 } 8 9 public T Resolve<T>() 10 { 11 Type type = keyValuePairs[typeof(T).FullName]; 12 13 return Resolve<T>(type); 14 } 15 16 private T Resolve<T>(Type type) 17 { 18 if (keyValuePairs.ContainsKey(type.FullName)) 19 { 20 type = keyValuePairs[type.FullName]; 21 } 22 23 //构造注入 24 var ctorArray = type.GetConstructors(); 25 var ctor = ctorArray.FirstOrDefault(x => x.IsDefined(typeof(musAttribute), true)); 26 27 if (ctor == null) 28 { 29 ctor = ctorArray.OrderBy(x => x.GetParameters().Length).Last(); 30 } 31 32 List<object> list = new List<object>(); 33 foreach (var item in ctor.GetParameters()) 34 { 35 var itemType = item.ParameterType; 36 var itemTargeType = keyValuePairs[itemType.FullName]; 37 var target = this.Resolve<object>(itemTargeType); 38 list.Add(target); 39 } 40 41 T t = default(T); 42 t = (T)Activator.CreateInstance(type, list.ToArray()); 43 44 //属性注入 45 var protes = type.GetProperties(); 46 47 foreach (var item in protes) 48 { 49 var isAttr = item.IsDefined(typeof(PromusAttribute)); 50 if (isAttr) 51 { 52 var itemType = item.PropertyType; 53 var itemTargeType = keyValuePairs[itemType.FullName]; 54 item.SetValue(t, this.Resolve<object>(itemTargeType)); 55 } 56 } 57 58 //方法注入 59 var method = type.GetFields(); 60 foreach (var item in method) 61 { 62 var isAttr = item.IsDefined(typeof(MethodAttribute)); 63 if (isAttr) 64 { 65 var itemType = item.FieldType; 66 var itemTargeType = keyValuePairs[itemType.FullName]; 67 item.SetValue(t, this.Resolve<object>(itemTargeType)); 68 } 69 } 70 return t; 71 } 72 }