Unity3D_Util_类工厂_自动注入

/// <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();
            }
        }

猜你喜欢

转载自www.cnblogs.com/PandaHome/p/10948582.html