C # - Получить функцию пространства имен принадлежит? - PullRequest
2 голосов
/ 24 октября 2010

Что-то похожее, если я введу строку "Console.WriteLine", она вернет -> "System.Console.WriteLine"

Я предполагаю, что есть какой-то путь через Отражение.

Ответы [ 2 ]

5 голосов
/ 24 октября 2010

Ну, проблема несколько сложнее, чем вы думаете.

Прежде всего, довольно просто сканировать все типы во всех загруженных сборках.Так, например, чтобы найти именно то, что вы ищете, вот что вы можете сделать:

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 в верхней части файла диктуюткоторый будет найден.С этим кодом такой вещи нет, поэтому вам нужно было бы самому кодировать какие-либо правила для этого.

Теперь, лучший вопрос (от меня к вам) - для чего вы собираетесь использовать этот код.Возможно, есть лучший способ помочь вам, если вы сообщите нам, какова конечная цель.

0 голосов
/ 24 октября 2010

Google имя ; Обычно вы найдете документацию MSDN, в которой указано пространство имен.

Используя отражение, вам нужно было бы перебирать все классы в каждом пространстве имен в каждой сборке в поисках совпадений.

...