private object CreateObject(Type type, ResolutionList resolutionPath, RegistrationKey keyToResolve) { var ctors = type.GetConstructors(); if (ctors.Length == 0) { ctors = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance); } Debug.Assert(ctors.Length > 0, "Class must have a constructor!"); int maxParamCount = ctors.Max(ctor => ctor.GetParameters().Length); var maxParamCountCtors = ctors.Where(ctor => ctor.GetParameters().Length == maxParamCount).ToArray(); object obj; if (maxParamCountCtors.Length == 1) { ConstructorInfo ctor = maxParamCountCtors[0]; if (resolutionPath.Contains(type)) { throw new ObjectContainerException("Circular dependency found! " + type.FullName, resolutionPath); } var args = ResolveArguments(ctor.GetParameters(), keyToResolve, resolutionPath.AddToEnd(type)); obj = ctor.Invoke(args); } else { throw new ObjectContainerException("Multiple public constructors with same maximum parameter count are not supported! " + type.FullName, resolutionPath); } return(obj); }
private object InvokeFactoryDelegate(Delegate factoryDelegate, ResolutionList resolutionPath, RegistrationKey keyToResolve) { if (resolutionPath.Contains(keyToResolve)) { throw new ObjectContainerException("Circular dependency found! " + factoryDelegate.ToString(), resolutionPath.ToTypeList()); } var args = ResolveArguments(factoryDelegate.Method.GetParameters(), keyToResolve, resolutionPath.AddToEnd(keyToResolve, null)); return(factoryDelegate.DynamicInvoke(args)); }
public bool AddAndSelectResolution() { if (NewGridWidth <= 0 || NewGridHeight <= 0) { return(true); } SelectedResolution = NewGridWidth + " x " + NewGridHeight; if (ResolutionList.Contains(NewGridWidth + " x " + NewGridHeight)) { return(false); } RemoveOldestResolutionIfMoreThenTen(); ResolutionList.Add(NewGridWidth + " x " + NewGridHeight); return(false); }