2015-10-29 2 views
1

У меня есть программа, в которой я должен проверить, соответствует ли какой-либо тип автоматического свойства имени класса.Regex для соответствия типам свойств C#

Так, например, если у меня есть:

public class User 
{ 
    //Some code here 
} 


public class Cars 
{ 
    public string Brand {get; set;} 
    public string YearModel {get; set;} 
    public List<User> HasRented {get; set;} 
} 

Теперь у меня уже есть код, чтобы соответствовать имена классов, так что я могу получить имя «User» от «общественного класса User». Проблема в том, что мне нужно регулярное выражение, чтобы получить «List<User>» с «public List<User> HasRented {get; set;}». Конечно, я хочу получить все типы свойств. Поэтому я также хочу, чтобы две «строки» соответствовали регулярному выражению.

Если это какая-либо помощь, у меня уже есть регулярное выражение, которое получает имя свойства, так что, может быть, кто-то может помочь мне изменить его, чтобы получить тип свойств вместо этого?

REGEX: \ W + (= \ s * {\ с * получить \ б?)

EDIT: забыл упомянуть, что у меня есть источник в виде строки, поэтому я хотел бы чтобы совместить его с регулярным выражением. Чтобы быть более ясным: ТОЛЬКО, с чем мне нужна помощь, является регулярное выражение для получения типов свойств из текста, содержащего класс, заполненный автоматическими свойствами. Не соответствие имени класса.

+0

Просто так я понимаю, это правильно: у вас есть источник как * строки * и хотите, чтобы извлечь из него информацию? Код не скомпилирован в вашу сборку, поэтому вы можете напрямую использовать типы «Автомобили» и «Пользователь»? – poke

+2

, если вы хотите извлечь информацию из исходного кода C#, почему бы не использовать Roslyn? похоже, было бы более надежным, чем regex ... –

+0

Да, извините. Забыл упомянуть, что у меня есть источник как строка. – thejokerish

ответ

1

Вы можете получить как имя и тип с:

(?<type>[^\s]+)\s(?<name>[^\s]+)(?=\s\{get;) 

DEMO или просто введите:

(\S+(?:<.+?>)?)(?=\s\w+\s\{get;) 

DEMO

+0

Спасибо! Второе регулярное выражение - именно то, что я искал. – thejokerish

+0

На самом деле, мне тоже понадобилось первое регулярное выражение. Если бы я мог выправить вас дважды, сэр, я бы! – thejokerish

+1

@Jokerish, тогда лучше изменить его, чтобы он соответствовал второму, проверьте [ЗДЕСЬ] (https://regex101.com/r/hT1aQ1/4), без него он не будет соответствовать более сложным общим типам –

0

регулярное выражение ^\s*public\s+([^\s]+)\s+[^\s]+\s+\{[^\}\n]+\} с модификаторами глобальными и многострочный возвратит имя класса свойств

+0

Hi Keith. Может быть, я был немного неясен, но у меня уже есть код, чтобы проверить, соответствует ли возвращаемое значение из регулярного выражения имени класса. Единственный код, который мне нужен, на самом деле представляет собой регулярное выражение, соответствующее типу свойства. Поэтому, если свойство является 'public string Name {get; задавать; } 'регулярное выражение должно соответствовать' string'. Если свойство является 'public List HasRented {get; задавать; } 'регулярное выражение должно соответствовать' List '. Если существует класс с несколькими свойствами, регулярное выражение должно соответствовать всем типам свойств в этом классе. – thejokerish

2

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

List<SortedList<string, User>> 

В этом случае лучше разрешить компилятор C# (csc) выполнять работу.

Я предполагаю, что код может быть скомпилирован, конечно, так как в вашем исходном коде отсутствует требуемый оператор using для System.Collections.Generic;

Вот код для компиляции исходного кода:

CSharpCodeProvider prov = new CSharpCodeProvider(); 
    CompilerResults results = prov.CompileAssemblyFromFile(new System.CodeDom.Compiler.CompilerParameters(), new string[] { "c:\\temp\\code.txt" }); 
    if (results.Errors.Count == 0) 
    { 
     Assembly assembly = results.CompiledAssembly; 
     foreach (Type type in assembly.GetTypes()) 
     { 
      Console.WriteLine("Type: {0}", type.Name); 
      foreach (PropertyInfo pi in type.GetProperties()) 
      { 
       Console.WriteLine(" Property: {0}, Return Type: {1}", pi.Name, pi.PropertyType); 
      } 
     } 
    } 

А вот выход:

Type: User 
Type: Cars 
    Property: Brand, Return Type: System.String 
    Property: YearModel, Return Type: System.String 
    Property: HasRented, Return Type: System.Collections.Generic.List`1[User] 
+0

Спасибо, но это не мой случай. В моем случае это будет регулярное выражение. – thejokerish

+0

Спасибо за +1 :) –

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