确定执行的来源

时间:2009-08-07 21:41:37

标签: c# asp.net

想象一下,我在C#中有一个叫做“Bar”的类,它有一个名为Foo()的公共函数。

在Foo()函数中,有没有办法识别Foo()的执行位置?更准确地说,我想知道是否从.aspx文件中调用了Foo()。像这样<%Bar.Foo()%>而不是Bar.Foo()背后的代码。

我问的原因是我希望函数在.aspx文件中执行时表现不同。

修改

我意识到我可以使用两种不同的功能,我真的不想深入了解我的问题的无聊细节,因为它很难解释,更不用说很长时间了。只要知道这是我正在努力解决的一个独特问题,我知道我可以通过识别它的来源来解决它。

3 个答案:

答案 0 :(得分:2)

当你说“表现不同”时;我想知道检查HttpContext.Current(在添加对System.Web.dll的引用之后)是否是一个更好的主意......

否则,你进入堆栈帧解析领域;不是个好主意。

当然,我希望代码能够以同样的方式完成同样的工作,使用依赖注入等方法处理差异......

答案 1 :(得分:0)

有可能通过检查堆栈,但对我来说这将是一个非常难闻的气味。您可能希望使用Decorator模式来修改Bar的行为,从网页调用时为其提供不同的Foo()实现。

例如,

<% new WebBar( Bar ).Foo(); %>

WebBar具有使用Bar的不同Foo实现,但执行您想要的不同计算。这使您的Bar类不必具有“网络感知”,但仍然为您提供了一种相对简单的方法来从中获取“网络”行为。

另一方面,如果你所追求的只是让它在代码隐藏中执行时返回一个字符串并在ASPX中执行时写入响应,那么只需使用一组不同的标记。

<%= Bar.Foo() %>

而不是

<% Bar.Foo(); %>

答案 2 :(得分:0)

问题是,ASPX文件实际上在编译时转换为与.cs和designer.cs文件相同的文件。它们都是单个运行时类的抽象。我认为你要做的就是在显示它们时以不同的方式对它们进行格式化。我建议你考虑为它创建一个函数,或者如果它是一个类,则覆盖ToString。