C# - 获取命名空间功能属于?

时间:2010-10-24 14:03:44

标签: c# .net reflection namespaces

类似的东西,如果我输入字符串“Console.WriteLine”,它将返回 - > “的System.Console.WriteLine”

我认为通过反思有一些方法。

2 个答案:

答案 0 :(得分:5)

嗯,这个问题比你想象的要困难一些。

首先,扫描所有已加载程序集中的所有类型非常简单。例如,要找到您正在寻找的内容,请执行以下操作:

void Main()
{
    String input = "Console.WriteLine";

    var fullNames =
        (from asm in AppDomain.CurrentDomain.GetAssemblies()
         from type in asm.GetTypes()
         from member in type.GetMembers()
         let memberWithName = type.Name + "." + member.Name
         where memberWithName == input
         select type.FullName + "." + member.Name).Distinct();
     fullNames.Dump();
}

注意,上面的代码是为了运行LINQPad而编写的,LINQ查询就是你正在寻找的东西。

但是,有一个小问题。

如果尚未加载程序集怎么办?那你就找不到了。此外,在上面的查询中,调用Distinct背后的目的是控制台有许多重载。当然,为了您的目的,这些都会产生相同的名称,因此调用Distinct

另外,请注意,如果我使用Console方法创建自己的名为WriteLine的类,上面的代码也会发现,也无法区分这两者。

当你的代码中有这样的场景(即多个类)时,文件顶部的using指令指示将找到哪一个。有了这段代码,就没有这样的东西了,所以你需要为自己编写任何规则。

现在,一个更好的问题(从我到你)是你打算使用这个代码的。如果您告诉我们最终目的是什么,也许有更好的方法来帮助您。

答案 1 :(得分:0)

Google the name;您通常会找到MSDN文档,它为您提供命名空间。

使用反射,您需要遍历每个程序集中每个名称空间中寻找匹配项的每个类。