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

Bla*_*lam 2 .net c# reflection namespaces

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

我假设通过反思有一些方法.

ang*_*son 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();
}
Run Code Online (Sandbox Code Playgroud)

注意,上面的代码是通过LINQPad运行的,LINQ查询还有你要找的东西.

但是,有一个小问题.

如果组件未加载(尚未)怎么办?那你就找不到了.此外,在上面的查询中,调用背后的目的Distinct是Console有许多重载.当然,为了你的目的,那些都会产生相同的名字,因此呼吁Distinct.

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

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

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