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

StackFrame在发布模式下的行为不同Share

时间:2023-04-10 21:54:00 C#

StackFrame在发布模式下的行为不同这里是我的代码:///[UserPreferenceProperty(Category="Email",DefaultValue="Mydefaultvalue")]publicstaticstringSignature{get{returnUserPreferenceManager.获取值();}设置{UserPreferenceManager.设置值(值);}}}publicstaticstringGetValue(){if(((VTXPrincipal)Thread.CurrentPrincipal).VTXIdentity.OperatorID==null){thrownewException("MissingOperatorID");}字符串值=string.Empty;varframe=newStackFrame(1);*****<------问题在这里.....varproperty=frame.GetMethod();varpropertyname=property.Name.Split('_')[1];vartype=property.DeclaringType;*****<------这里有问题.....if(type!=null){varuserPreference=typeof(UserPreferences).GetProperty(propertyname).GetCustomAttributes(true).FirstOrDefault()asUserPreferencePropertyAttribute;if(userPreference!=null){字符串gcategory=userPreference.Category;字符串描述=属性名;值=GetValue(类别,描述,((VTXPrincipal)Thread.CurrentPrincipal).VTXIdentity.OperatorID);if(value==null){//总是返回一些东西returnuserPreference.默认值;}}else{thrownewException("MissingUserPreference");}}返回值;在GetValue方法中,StackFrame在发布模式下的工作方式与调试模式不同在调试模式下,我正确地将属性名称设置为签名,但在发布模式下,属性名称为GetUserPreferenceValueTest因为这是将作为客户端调用的测试方法。所以我的代码在调试模式下工作,但在发布模式下失败。问:如何正确使用StackFrame,使其在调试与发布模式下工作。Q.有没有其他方法可以在运行时获取调用属性名称和相关信息?我回答了一个类似的问题,在这里阅读我的回答。简而言之,这是一个非常糟糕的设计决定,因为你的方法是一个伪君子——它与不同的调用者不同,但在打开时不告诉它。你的API不应该依赖于调用它的人。此外,由于lambda、yield和await等语言特性,编译器可能会以意想不到的方式中断堆栈跟踪,因此即使这在Release模式下有效,总有一天也会中断。您正在有效地构建复杂的间接机制,而不是使用旨在将信息传递给方法(方法参数)的语言功能。为什么要使用属性?你在别的地方见过吗?如果这样做,并且不想将“Email”重复作为GetValue调用和属性值的参数,则可以考虑将属性Expression传递给GetValue,后者将提取属性。这类似于您的解决方案,但它是明确的:}set{SetValue(prefs=>prefs.Signature,value);这个答案展示了如何做到这一点。我看到您正在检查代码中的Thread.CurrentPrincipal。同样,这不是一个很好的做法,因为对于客户端代码来说,访问该属性可能会导致异常并不明显。对于代码背后的人来说,这将是一场调试噩梦(相信我,您的代码可能会在生产环境中运行多年,即使在您迁移到另一个项目很久之后)。相反,您应该将VTXIdentity作为参数传递给设置类构造函数。这将确保调用代码知道您在此级别强制执行安全性,并且根据定义知道从何处获取此令牌。此外,这允许您在知道错误时立即抛出异常,而不是在访问某些属性时抛出异常。这将帮助维护人员更早地发现错误——就像编译错误比运行时错误更好一样。最后,虽然这是一个有趣的练习,但在C#中有许多用于存储和读取配置的高性能和经过测试的解决方案。为什么你认为你需要重新发明轮子?假设您的问题仍然存在,您是否可以使用另一个库而不是滚动自己的库...如果您发现自己使用C#5和.NET4.5,请查看CallerMemberName属性。使用CallerMemberName,可以修改GetValue()方法签名publicstaticstringGetValue([CallerMemberName]stringcallerName="")然后,该属性可以调用不带参数的GetValue(),您将属性名称传递给GetValue().以上是C#学习教程:StackFrame在release模式下表现不同。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: