/// <summary> /// class注入 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class ClassInjectAttribute : Attribute { }
利用FactoryManager创建类时 类中被[ClassInject]标注的属性将自动注入
public class Test : IFactory { [ClassInject] public XXX xxx { get; set; } public void InjectionBind() { //自动注入后调用 } }
具体实现是:利用反射取得类ClassInject 标注的属性,再根据类型创建
public static void Injection(object factory) { BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; foreach (PropertyInfo item in factory.GetType().GetProperties(flag)) { foreach (Attribute a in item.GetCustomAttributes(true)) { if (a is MonoInjectAttribute) { MonoInjectAttribute monoInject = a as MonoInjectAttribute; if (null != monoInject) { var t = item.PropertyType; var obj = CreatSingtonMonoBehaviour(t); item.SetValue(factory, obj, null); } } else if (a is ClassInjectAttribute) { ClassInjectAttribute classInjectAttribute = a as ClassInjectAttribute; if (null != classInjectAttribute) { var t = item.PropertyType; var obj = CreatClass(t); item.SetValue(factory, obj, null); } } else if (a is EventArgsInjectAttribute) { EventArgsInjectAttribute eventArgsInjectAttribute = a as EventArgsInjectAttribute; if (null != eventArgsInjectAttribute) { var t = item.PropertyType; var obj = CreatEventClass(t,eventArgsInjectAttribute.Key); item.SetValue(factory, obj, null); } } } } if (factory is IFactory) { ((IFactory)factory).InjectionBind(); } }