Regex以匹配属性类型C#
本文关键字:类型 属性 Regex | 更新日期: 2023-09-27 18:19:41
我有一个程序,我必须在其中检查是否有任何自动属性类型与类名匹配。
例如,如果我有:
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;}
}
现在,我已经有了匹配类名的代码,所以我可以从"public class User"中获得名称"User"。问题是,我需要正则表达式从"public List<User> HasRented {get; set;}
"中获取"List<User>
"。当然,我想得到所有的属性类型。因此,我还希望正则表达式中的两个"字符串"匹配。
如果有什么帮助的话,我已经有了一个regex,它可以获取属性的名称,所以也许有人可以帮我修改它,以获取属性的类型?
REGEX:''w+(?=''s*{''s*get''b)
EDIT:忘了把源代码作为字符串,这就是为什么我想用regex来匹配它。需要特别说明的是:我唯一需要帮助的是regex,它可以从包含一个填充了自动属性的类的文本中获取属性类型。与类名不匹配。
使用正则表达式解析代码是没有用的,因为属性的类型不限于1级泛型,可以是任何类似的类型
List<SortedList<string, User>>
在这种情况下,最好让C#编译器(csc)来做这项工作。
我认为代码当然可以编译,因为您的源代码缺少System.Collections.Generic所需的using语句;
以下是编译源代码的代码:
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]
您可以使用获取名称和类型
(?<type>[^'s]+)'s(?<name>[^'s]+)(?='s'{get;)
演示或者只键入:
('S+(?:<.+?>)?)(?='s'w+'s'{get;)
演示
^'s*public's+([^'s]+)'s+[^'s]+'s+'{[^'}'n]+'}
将返回属性的类名