private object ChangeType(IViewFolderSettings viewFolderSettings, ParameterInfo param) { if (param.ParameterType == typeof(Assembly)) { return(Assembly.Load(viewFolderSettings.Parameters[param.Name])); } return(Convert.ChangeType(viewFolderSettings.Parameters[param.Name], param.ParameterType)); }
private IViewFolder ActivateViewFolder(IViewFolderSettings viewFolderSettings) { Type type; Func <ParameterInfo, bool> predicate = null; switch (viewFolderSettings.FolderType) { case ViewFolderType.FileSystem: type = typeof(FileSystemViewFolder); break; case ViewFolderType.VirtualPathProvider: type = typeof(VirtualPathProviderViewFolder); break; case ViewFolderType.EmbeddedResource: type = typeof(EmbeddedViewFolder); break; case ViewFolderType.Custom: type = Type.GetType(viewFolderSettings.Type); break; default: throw new ArgumentException("Unknown value for view folder type"); } ConstructorInfo info = null; foreach (ConstructorInfo info2 in type.GetConstructors()) { if ((info == null) || (info.GetParameters().Length < info2.GetParameters().Length)) { if (predicate == null) { predicate = param => viewFolderSettings.Parameters.ContainsKey(param.Name); } if (info2.GetParameters().All <ParameterInfo>(predicate)) { info = info2; } } } if (info == null) { throw new MissingMethodException(string.Format("No suitable constructor for {0} located", type.FullName)); } object[] args = (from param in info.GetParameters() select this.ChangeType(viewFolderSettings, param)).ToArray <object>(); return((IViewFolder)Activator.CreateInstance(type, args)); }
private IViewFolder ActivateViewFolder(IViewFolderSettings viewFolderSettings) { Type type; switch (viewFolderSettings.FolderType) { case ViewFolderType.FileSystem: type = typeof(FileSystemViewFolder); break; case ViewFolderType.EmbeddedResource: type = typeof(EmbeddedViewFolder); break; case ViewFolderType.VirtualPathProvider: type = typeof(VirtualPathProviderViewFolder); break; case ViewFolderType.Custom: type = Type.GetType(viewFolderSettings.Type); break; default: throw new ArgumentException("Unknown value for view folder type"); } ConstructorInfo bestConstructor = null; foreach (var constructor in type.GetConstructors()) { if (bestConstructor == null || bestConstructor.GetParameters().Length < constructor.GetParameters().Length) { if (constructor.GetParameters().All(param => viewFolderSettings.Parameters.ContainsKey(param.Name))) { bestConstructor = constructor; } } } if (bestConstructor == null) { throw new MissingMethodException(string.Format("No suitable constructor for {0} located", type.FullName)); } var args = bestConstructor.GetParameters() .Select(param => ChangeType(viewFolderSettings, param)) .ToArray(); return((IViewFolder)Activator.CreateInstance(type, args)); }
private object ChangeType(IViewFolderSettings viewFolderSettings, ParameterInfo param) { if (param.ParameterType == typeof(Assembly)) return Assembly.Load(viewFolderSettings.Parameters[param.Name]); return Convert.ChangeType(viewFolderSettings.Parameters[param.Name], param.ParameterType); }
private IViewFolder ActivateViewFolder(IViewFolderSettings viewFolderSettings) { Type type; switch (viewFolderSettings.FolderType) { case ViewFolderType.FileSystem: type = typeof(FileSystemViewFolder); break; case ViewFolderType.EmbeddedResource: type = typeof(EmbeddedViewFolder); break; case ViewFolderType.VirtualPathProvider: type = typeof(VirtualPathProviderViewFolder); break; case ViewFolderType.Custom: type = Type.GetType(viewFolderSettings.Type); break; default: throw new ArgumentException("Unknown value for view folder type"); } ConstructorInfo bestConstructor = null; foreach (var constructor in type.GetConstructors()) { if (bestConstructor == null || bestConstructor.GetParameters().Length < constructor.GetParameters().Length) { if (constructor.GetParameters().All(param => viewFolderSettings.Parameters.ContainsKey(param.Name))) { bestConstructor = constructor; } } } if (bestConstructor == null) throw new MissingMethodException(string.Format("No suitable constructor for {0} located", type.FullName)); var args = bestConstructor.GetParameters() .Select(param => ChangeType(viewFolderSettings, param)) .ToArray(); return (IViewFolder)Activator.CreateInstance(type, args); }