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

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

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;}
}

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

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

REGEX: \ w + (? = \ s * {\ s * получить \ b)

РЕДАКТИРОВАТЬ: Забыл упомянуть, что у меня есть источник в виде строки, поэтому я хотел бы сопоставить его с регулярным выражением. Для большей ясности: ЕДИНСТВЕННАЯ вещь, с которой мне нужна помощь, - это регулярное выражение для получения типов свойств из текста, содержащего класс, заполненный автоматическими свойствами. Не совпадает с именем класса.

1
thejokerish 29 Окт 2015 в 11:18

3 ответа

Лучший ответ

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

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

ДЕМО или просто введите:

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

ДЕМО

1
m.cekiera 29 Окт 2015 в 09:21

Regex ^\s*public\s+([^\s]+)\s+[^\s]+\s+\{[^\}\n]+\} с модификаторами global и multiline вернет имена классов свойств

0
Keith Hall 29 Окт 2015 в 08:57

Использование регулярных выражений для синтаксического анализа кода бесполезно, поскольку тип свойств не ограничивается универсальными типами 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]
2
Oguz Ozgul 29 Окт 2015 в 09:14