当前位置: 首页 > 编程语言 > C#

分享_11118

时间:2023-04-10 23:47:44 C#

在C#4.0中使用DynamicRuntimeBinderException在C#4.0中使用DynamicRuntimeBinderException我有一个接口:publicabstractclassAuthorizerwhereT:RequiresAuthorization{publicAuthorizationStatusAuthorize(Trecord){//Performauthorizationspecificstuff//然后交给一个抽象方法来处理T-specific的东西//当授权成功时应该发生}}然后,我有一堆不同的类都实现了RequiresAuthorization,因此,每个都有一个授权者(每个业务我域中的对象需要不同的逻辑才能在授权记录后执行)。我还使用了一个UnityContainer,我在其中注册了各种授权者。然后我有一些代码如下从数据库中找到正确的记录并授权它:varauthorizerType=type.GetType(String.Format("Foo.Authorizer`1[[{0}]],Foo",dbItem.GetType().AssemblyQualifiedName));动态授权者=ChildContainer.Resolve(type)为动态;authorizer.Authorize(dbItem);基本,我使用对象上的Id从数据库中检索它。在幕后,NHibernate负责确定它是什么类型的RequiresAuthorization。然后我想为它找到合适的Authorizer(我不知道在编译时我需要什么Authorizer实现,所以我有点反省以获得完全限定的类型)。为此,我使用UnityContainer的Resolve方法的非泛型重载从配置中找到正确的授权方。最后,我想在授权方上调用Authorize,传递我从NHibernate取回的对象。现在,对于问题:在VS2010的Beta2中,上面的代码可以完美运行。在RC和RTM上,一旦我进行Authorize()调用,我得到一个RuntimeBinderException说“'Foo.Authorizer.Authorize(Bar)'的最佳重载方法匹配'Foo.Authorizer.Authorize(Bar)'有一些无效参数”。当我在调试器中检查授权者时,它是正确的类型。当我在上面调用GetType()时。GetMethods(),我可以看到带有Bar的授权方法。如果我对dbItem执行GetType(),它就是一个Bar。由于这在Beta2中有效,在RC中无效,我认为这是一个回归(它看起来应该有效)并且我推迟完成它,直到我有机会在C#4.0的RTM版本上测试它。现在我已经这样做了,问题仍然存在。有没有人有任何建议让这个工作?谢谢特伦斯,我需要更多关于GameType及其定义的信息来理解问题到底是什么,但这个错误基本上告诉你它不能将dbItem转换为Bar。有两种可能:1)RetrieveRequiresAuthorizationById()返回动态,因此dbItem的编译时类型被推断为动态。如果是这种情况,运行时绑定器将在运行时为dbItem选择一个类型,如果可以找到,该类型本质上是最好的可访问类型。在可访问性的情况下,此类型不能转换为Bar。例如,dbItem的运行时类型可能是一些不可访问的类型,它有一个直接的基类对象,显然对象不能转换为Bar。2)RetrieveRequiresAuthorizationById()返回一些静态类型。在这种情况下,静态类型无法在运行时转换为Bar。我的猜测是(2)是这样,dbItem是RequiresAuthorization类型。我猜也是一个界面。这不会转换为任何类型。如果我是对的,那么您要做的就是使dbItem动态化。如果这样做,那么运行时绑定器将为dbItem选择合适的类型,这可能就是您要这样做的全部原因。以上就是C#学习教程:在C#4.0中使用动态RuntimeBinderException的全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注varauthorizerType=type.GetType(String.Format("Foo.Authorizer`1[[{0}]],Foo",dbItem.GetType().AssemblyQualifiedName));动态授权者=ChildContainer.Resolve(type)为动态;authorizer.Authorize(dbItem为动态);//本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: