public interface IHttpHeaderInspectingAuthenticatorFactory where T: HttpHeaderInspectingAuthenticatorConfigurationElement { IHttpHeaderInspectingAuthenticator Construct(T config); } public class BasicAuthenticationInspectingAuthenticatorFactory : IHttpHeaderInspectingAuthenticator { public IHttpHeaderInspectingAuthenticator Construct(BasicAuthenticationHeaderInspectorConfigurationElement config) { return new BasicAuthenticationInspectingAuthenticator(config); } } public class BasicAuthenticationInspectingAuthenticator : HttpHeaderInspectingAuthenticatorBase { internal BasicAuthenticationInspectingAuthenticator(BasicAuthenticationHeaderInspectorConfigurationElement config) : base(config) {} //snip -- IHttpHeaderInspectingAuthenticator and IHttpHeaderInspectingAuthenticator implementation } public class BasicAuthenticationHeaderInspectorConfigurationElement : HttpHeaderInspectingAuthenticatorConfigurationElement { //extra properties } public class HttpHeaderInspectingAuthenticatorConfigurationElement : ConfigurationElement { protected override void PostDeserialize() { base.PostDeserialize(); //simple verification of info supplied in config var t = Type.GetType(Factory); if (null == t) throw new ConfigurationErrorsException(String.Format("The factory type specified [{0}] cannot be found - check configuration settings", Factory ?? "")); if (!typeof(IHttpHeaderInspectingAuthenticatorFactory<>).IsGenericInterfaceAssignableFrom(t)) throw new ConfigurationErrorsException(String.Format("The factory type specified [{0}] must derive from {1} - check configuration settings", Factory ?? "", typeof(IHttpHeaderInspectingAuthenticatorFactory<>).Name)); var c = t.GetConstructor(Type.EmptyTypes); if (null == c) throw new ConfigurationErrorsException(String.Format("The factory type specified [{0}] must have a parameterless constructor - check configuration settings", Factory ?? "")); } [ConfigurationProperty("factory", IsRequired = true)] public string Factory { get { return (string)this["factory"]; } set { this["factory"] = value; } } //this allows us to use types derived from HttpHeaderInspectingAuthenticatorConfigurationElement protected override bool OnDeserializeUnrecognizedAttribute(string name, string value) { ConfigurationProperty property = new ConfigurationProperty(name, typeof(string), value); Properties.Add(property); base[property] = value; return true; } public IHttpHeaderInspectingAuthenticator GetInspector() { dynamic factoryInstance = Activator.CreateInstance(Type.GetType(Factory)); return factoryInstance.Construct(this); } } Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The best overloaded method match for 'Redcated.Authentication.BasicAuthenticationInspectingAuthenticatorFactory.Construct(Redcated.Authentication.Configuration.BasicAuthenticationHeaderInspectorConfigurationElement)' has some invalid arguments at CallSite.Target(Closure , CallSite , Object , HttpHeaderInspectingAuthenticatorConfigurationElement ) at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) at Redcated.Authentication.Configuration.HttpHeaderInspectingAuthenticatorConfigurationElement.GetInspector() in D:UsersebrownDocumentsVisual Studio 2010ProjectsUtilitysourceAuthentication LibraryConfigurationHttpHeaderInspectingAuthenticatorConfigurationElement.cs:line 79 at Redcated.Authentication.Configuration.HttpHeaderInspectingAuthenticatorConfigurationElementCollection.b__0(HttpHeaderInspectingAuthenticatorConfigurationElement i) in D:UsersebrownDocumentsVisual Studio 2010ProjectsUtilitysourceAuthentication LibraryConfigurationHttpHeaderInspectingAuthenticatorConfigurationElementCollection.cs:line 78 at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector) at Redcated.Authentication.HttpHeaderInspectingAuthenticationModule.AuthenticateRequest(Object sender, EventArgs e) in D:UsersebrownDocumentsVisual Studio 2010ProjectsUtilitysourceAuthentication LibraryHttpHeaderInspectingAuthenticationModule.cs:line 49 at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) public interface IHttpHeaderInspectingAuthenticatorFactory { IHttpHeaderInspectingAuthenticator Construct(HttpHeaderInspectingAuthenticatorConfigurationElement config); } public interface IHttpHeaderInspectingAuthenticatorFactory : IHttpHeaderInspectingAuthenticatorFactory where T: HttpHeaderInspectingAuthenticatorConfigurationElement { IHttpHeaderInspectingAuthenticator Construct(T config); } public abstract class HttpHeaderInspectingAuthenticatorFactoryBase : IHttpHeaderInspectingAuthenticatorFactory where T : HttpHeaderInspectingAuthenticatorConfigurationElement { protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public abstract IHttpHeaderInspectingAuthenticator Construct(T config); public IHttpHeaderInspectingAuthenticator Construct(HttpHeaderInspectingAuthenticatorConfigurationElement config) { return Construct((T)config); } } public class BasicAuthenticationInspectingAuthenticatorFactory : HttpHeaderInspectingAuthenticatorFactoryBase { public override IHttpHeaderInspectingAuthenticator Construct(BasicAuthenticationHeaderInspectorConfigurationElement config) { return new BasicAuthenticationInspectingAuthenticator(config); } } public IHttpHeaderInspectingAuthenticator GetInspector() { var factoryInstance = (IHttpHeaderInspectingAuthenticatorFactory)Activator.CreateInstance(Type.GetType(Factory)); return factoryInstance.Construct(this); } dynamic factoryInstance = Activator.CreateInstance(Type.GetType(Factory)); dynamic parameter = this; return factoryInstance.Construct(parameter);