检索调用方法的命名空间的名称

时间:2014-05-19 15:07:42

标签: c# reflection namespaces

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

我知道如何找到一个调用方法的名字,但这是我的意思。

所以这里是我在C#中使用自动化测试解决方案所需要的类比:

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

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

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

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

查看Caller Information

  

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

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

答案 1 :(得分:0)

您还可以使用http://msdn.microsoft.com/en-us/library/4ce0ktkk(v=vs.110).aspx获取当前堆栈信息。您可以使用" GetFrame"导航到您想要在调用堆栈中返回的距离,并使用这些结果获取有关调用者的信息,包括其"类型",然后它& #39; s"命名空间"。

答案 2 :(得分:0)

您不应该尝试检查调用方法的命名空间。正如Jon Skeet 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; } }
}