- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为 HttpModule 构建了一个通用配置系统,它允许可插入的 HTTP header 检查器。作为引用,这里是代码的基本布局——这应该足以让我了解我在做什么:
public interface IHttpHeaderInspectingAuthenticatorFactory<T>
where T: HttpHeaderInspectingAuthenticatorConfigurationElement
{
IHttpHeaderInspectingAuthenticator<T> Construct(T config);
}
public class BasicAuthenticationInspectingAuthenticatorFactory :
IHttpHeaderInspectingAuthenticator<BasicAuthenticationHeaderInspectorConfigurationElement>
{
public IHttpHeaderInspectingAuthenticator<BasicAuthenticationHeaderInspectorConfigurationElement> Construct(BasicAuthenticationHeaderInspectorConfigurationElement config)
{
return new BasicAuthenticationInspectingAuthenticator(config);
}
}
public class BasicAuthenticationInspectingAuthenticator : HttpHeaderInspectingAuthenticatorBase<BasicAuthenticationHeaderInspectorConfigurationElement>
{
internal BasicAuthenticationInspectingAuthenticator(BasicAuthenticationHeaderInspectorConfigurationElement config)
: base(config) {}
//snip -- IHttpHeaderInspectingAuthenticator<T> 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);
}
}
现在问题出现在 GetInspector 调用中——所提供的工厂名称的所有实例都必须实现 IHttpHeaderInspectingAuthenticatorFactor<>(如 PostDeserialize 中的规范)。因此,它们都有一个 Construct 方法,其中提供的类型 T 实际上是实现 GetInspector() 方法的类的实际类型。因此,例如,将在 BasicAuthenticationHeaderInspectorConfigurationElement 的实例上调用 GetInspector——因此“this”将是 BasicAuthenticationHeaderInspectorConfigurationElement 的实例。
但是,对 Construct 的调用失败了。它发现该方法很好,但显然参数类型与抛出的 RuntimeBinderException 不匹配。根据 CallSite.Target,动态代理期望的预期类型似乎是 HttpHeaderInspectingAuthenticatorConfigurationElement——我传递的“this”是 BasicAuthenticationHeaderInspectorConfigurationElement,派生自该基础。
那么是什么给了?我在这里没有得到什么吗?我尝试传递(this as dynamic)或((HttpHeaderInspectingAuthenticatorConfigurationElement)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:\Users\ebrown\Documents\Visual Studio 2010\Projects\Utility\source\Authentication Library\Configuration\HttpHeaderInspectingAuthenticatorConfigurationElement.cs:line 79
at Redcated.Authentication.Configuration.HttpHeaderInspectingAuthenticatorConfigurationElementCollection.<GetInspectors>b__0(HttpHeaderInspectingAuthenticatorConfigurationElement i) in D:\Users\ebrown\Documents\Visual Studio 2010\Projects\Utility\source\Authentication Library\Configuration\HttpHeaderInspectingAuthenticatorConfigurationElementCollection.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:\Users\ebrown\Documents\Visual Studio 2010\Projects\Utility\source\Authentication Library\HttpHeaderInspectingAuthenticationModule.cs:line 49
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
仅供引用——我已经通过稍微改变接口(interface)的架构来解决这个问题:
public interface IHttpHeaderInspectingAuthenticatorFactory
{
IHttpHeaderInspectingAuthenticator Construct(HttpHeaderInspectingAuthenticatorConfigurationElement config);
}
public interface IHttpHeaderInspectingAuthenticatorFactory<T> : IHttpHeaderInspectingAuthenticatorFactory
where T: HttpHeaderInspectingAuthenticatorConfigurationElement
{
IHttpHeaderInspectingAuthenticator<T> Construct(T config);
}
public abstract class HttpHeaderInspectingAuthenticatorFactoryBase<T> : IHttpHeaderInspectingAuthenticatorFactory<T>
where T : HttpHeaderInspectingAuthenticatorConfigurationElement
{
protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public abstract IHttpHeaderInspectingAuthenticator<T> Construct(T config);
public IHttpHeaderInspectingAuthenticator Construct(HttpHeaderInspectingAuthenticatorConfigurationElement config)
{
return Construct((T)config);
}
}
public class BasicAuthenticationInspectingAuthenticatorFactory :
HttpHeaderInspectingAuthenticatorFactoryBase<BasicAuthenticationHeaderInspectorConfigurationElement>
{
public override IHttpHeaderInspectingAuthenticator<BasicAuthenticationHeaderInspectorConfigurationElement> Construct(BasicAuthenticationHeaderInspectorConfigurationElement config)
{
return new BasicAuthenticationInspectingAuthenticator(config);
}
}
当然,GetInspector 调用变成了
public IHttpHeaderInspectingAuthenticator GetInspector()
{
var factoryInstance = (IHttpHeaderInspectingAuthenticatorFactory)Activator.CreateInstance(Type.GetType(Factory));
return factoryInstance.Construct(this);
}
所以我认为我的理解一定有失误...希望有人能给出一些启示。
谢谢!
最佳答案
我认为您需要将 this
转换为动态的。例如 factoryInstance.Construct((dynamic)this);
我认为问题是动态调用默认使用缓存委托(delegate)(目标)签名的编译时信息。
因为动态调用的实现是在基类中,它是它用于签名的,但是因为你的后期绑定(bind)签名是一个子类,你不能去 HttpHeaderInspectingAuthenticatorConfigurationElement
-> BasicAuthenticationHeaderInspectorConfigurationElement
,因此通过将参数转换为 dynamic,您告诉 DLR 参数类型是在运行时确定的。
关于c# - RuntimeBinderException - C# .NET 4 动态关键字 - 帮助我理解为什么方法不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2898307/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!