2014-09-17 2 views
0

Я пишу класс клиента, который будет читать файлы CS и выплевывать информацию на основе имен методов и их различных параметров.Получить тип объекта из строкового значения

Это, по существу, читает каждую строку, ища ключи (общедоступные, классные и т. Д.), А затем видит, что все это значит. В любом случае этот бит работает отлично, у меня возникают проблемы с работой с различными различными типами.

Так что мне нужно сделать, это выяснить, является ли тип одним из найденных в .Net, или что-то, что я создал, я действительно не беспокоюсь, насколько это возможно, пока у меня есть способ сообщить ,

Я пробовал Type t = Type.GetType("My.Namespace.Classname");, но это просто возвращает null даже с полным пространством имен и именем моего пользовательского объекта класса. Однако если я должен был сделать тот же код, но с System.String, он отлично работает, но я не могу объяснить каждое возможное пространство имен во всей структуре. Это будет означать, что мне нужен способ получить тип без полного пространства имен или узнать, как проверить мои собственные пользовательские объекты с помощью GetType.

Можно ли предложить какие-либо предложения о том, как это сделать? Даже если он создавал новый экземпляр объектов, которых было бы достаточно, но опять же у меня нет полного пространства имен для .Net-объектов.

Редактировать: Немного фона Что я делаю, это чтение классов, которые я создал в StreamReader, потому что я создаю их много, и мне нужно делать между объектами, что одна система будет способный понять, и другой, поэтому этот код будет читать все и просто создавать для меня отображение. И в большинстве случаев это совершенно нормально, только когда у меня есть пользовательские типы, поэтому я хочу их идентифицировать.

+2

Используйте 'Roslyn' для анализа исходного кода на C#. –

+0

Итак, вы разбираете файлы кода и пытаетесь определить, является ли тип, используемый в коде, типом .NET или стороннего типа? –

+0

http://msdn.microsoft.com/en-us/library/w3f99sx1(v=vs.110).aspx – Heaven42

ответ

1

Я пробовал тип t = Тип.GetType ("My.Namespace.Classname"); но это просто возвращает нуль

Вы должны обеспечить полный сборочный квалифицированных имя:

Type t = Type.GetType("My.Namespace.Classname, MyAssembly"); 

From MSDN:

Параметры

TYPENAME Тип: System.String

Ассемблерное имя типа, которое нужно получить. См. AssemblyQualifiedName. Если тип находится в выполняемой в настоящее время сборке или в Mscorlib.dll, достаточно указать имя типа , соответствующее его пространству имен.

В любом случае, если вы хотите проанализировать код C# и проанализировать его, я бы посмотрел на NRefactory - an open source C# parser -.

Here's an introduction in CodeProject to NRefactory.

+0

Это не сработает, если ссылочная сборка, используемая целевым проектом, не загружается в текущий момент. – Bas

+0

@BasBrekelmans MSDN говорит: ** Вы можете использовать метод GetType для получения объекта Type для типа в другой сборке, если вы знаете его имя, имя которого указано в имени. GetType вызывает загрузку сборки, указанной в typeName. ** –

+0

OP никогда не говорил о чтении другой сборки. Он пытается читать файлы CS. –

1

Я пробовал Type t = Type.GetType("My.Namespace.Classname");, но это просто возвращает null даже с полным пространством имен и именем моего пользовательского объекта класса.

Я подозреваю, что это потому, что это не в сборке вызывающего или mscorlib, которые являются только два сборки проверяются Type.GetType имен, которые не являются сборки квалифицированными.

Если вы знаете все собранные сборки, вы можете пройти через каждый из них, вызывая Assembly.GetType(namespaceQualifiedName) на каждом из них.

Однако, если вы даже не имеют квалифицированное имя пространства имен, вы должны возможно создать поиск по всех типов в все соответствующие узлы на основе их имен. Например:

var lookup = assemblies.SelectMany(a => a.GetTypes()) 
         .ToLookup(t => t.Name); 

В этот момент, для каждого имени у вас есть (например, Classname в вашем примере), вы можете найти все типы с этим именем:

foreach (var type in lookup[name]) 
{ 
    // Do something with type 
} 
0

Type.GetType(some_type_name) будет возвращать объект типа, если some_type_name это имя типа объявлены любые сборки загруженных в данный момент, или в Mscorlib.dll

Итак, если ваши разбирают свои типы из .cs файлов и не загружая ssebly - всегда будет null с именами типов из вашего исходного файла

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