【问题标题】:Retrieving the name of a calling method's namespace检索调用方法的命名空间的名称
【发布时间】:2014-07-07 14:50:04
【问题描述】:

如何获取调用了当前公共方法的方法的命名空间?

我知道如何找到调用方法的名称,但这让我感到困惑。

下面是我在 C# 中的自动化测试解决方案所需的类比:

“ExampleSolution.sln”中有两个cs文件。这些类库中的每一个都有一个命名空间。命名空间“1”和命名空间“A”。

两个命名空间都有一个类和一个方法。

命名空间 1 包含方法“LogIn”,而命名空间 A 包含方法“MyTest”。

MyTest 在开始时调用 LogIn 以执行登录过程。在 LogIn 内部,代码应确定调用方法 MyTest 的命名空间。因此,Namespace A 的字符串名称应该作为“A”返回给 Namespace 1 下的 LogIn 方法。

我想要这样做的原因是,解决方案的结构方式是有价值的组件信息存在,可用于确定一些变量的值,而不必每次都将这些值作为参数传递给 LogIn 方法调用了数百次。

非常感谢任何帮助。

【问题讨论】:

  • "1" 不是有效的命名空间名称。如果您可以演示代码问题而不仅仅是描述问题,那将会更加有用。顺便说一下,您需要知道命名空间的什么?老实说,这听起来像是一个设计问题。
  • 嗨,我在原帖中解释了为什么我需要它。此外,为了类比,这些名称是理论上的。
  • 在我完成之前按回车键* - 我还没有任何代码可供参考。如果我这样做了,我会发布它。
  • 不,你没有真正解释你为什么需要它。您说您想获取信息而不将其作为参数传递-您没有说明为什么这是一件好事。也许最好集中在您调用该方法的位置,而不是?或者在当前上下文的某处有信息?仅仅使用包含调用方法的类的命名空间听起来很脆弱,对测试不友好,而且通常是个坏主意。

标签: c# reflection namespaces


【解决方案1】:

看看Caller Information

通过使用 Caller Info 属性,您可以获得有关 方法的调用者。可以获取源代码的文件路径, 源代码中的行号,以及调用者的成员名称。 此信息有助于跟踪、调试和创建 诊断工具。

假设您的文件夹结构映射到您的命名空间,您可以使用CallerFilePathAttribute 来获取命名空间,而无需使用反射来获取它。

【讨论】:

  • 太棒了。现在来看看。会让你知道这是否能给我我需要的一切。看起来应该。
  • 这正是我所需要的!谢谢!
【解决方案2】:

您也可以使用http://msdn.microsoft.com/en-us/library/4ce0ktkk(v=vs.110).aspx 来获取当前堆栈信息。您可以使用“GetFrame”导航到要在调用堆栈中返回多远,并使用这些结果获取有关调用者的信息,包括其“类型”,然后是“命名空间”。

【讨论】:

  • 请注意,内联可能会导致与您预期不同的堆栈跟踪。
【解决方案3】:

您不应该尝试检查调用方法的命名空间。作为乔恩斯基特once said

只使用包含调用方法的类的命名空间听起来很脆弱,对测试不友好,而且通常是个坏主意。

相反,您可以将数据传递到您的方法中。将它包含在一个对象中可以让您保持代码干净、快速和可测试。

public interface IContext
{
    string SomeVariable { get; }
    int SomethingElse { get; }
}

public void LogIn(string user, IContext loginContext) { ... }


public class MyTestContext : IContext
{
    private MyTestContext() { }
    // TODO make this a singleton?
    public static MyTestContext Instance { get { return new MyTestContext(); } }
    public string SomeVariable { get { return "abc"; } }
    public int SomethingElse { get { return 2; } }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2013-01-08
    • 2016-05-19
    • 2010-10-11
    • 2021-02-11
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多