public static void Inject(IBuildContext context, object obj) { FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic); foreach (FieldInfo field in fields) { object[] attrs = field.GetCustomAttributes(typeof(InjectContextAttribute), true); if (attrs.Length == 0) continue; InjectContextAttribute attr = attrs[0] as InjectContextAttribute; if (attr == null || attr.Usage == ContextUsage.Out) continue; object injectionObject; if (field.FieldType == typeof(IBuildContext)) injectionObject = context; else if (!attr.Optional) injectionObject = context.GetContextObject(field.FieldType); else { IContextObject contextObject; context.TryGetContextObject(field.FieldType, out contextObject); injectionObject = contextObject; } field.SetValue(obj, injectionObject); } }