2010-10-24 3 views

ответ

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

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

+0

Удивительно, несмотря на то, что я очень скупился на множество деталей, это в значительной степени * точно *, что я хотел, спасибо :) – Blam

+0

Тогда не забудьте отметить это как принятый ответ :) –

0

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

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

Смежные вопросы