我想匹配方法名称(带参数)和属性名称。我不想在匹配中包含访问者。 例如,我有这样的课程:
public class test
{
public static string NA = "n/a";
public static DateTime DateParser(string dateToBeParsed)
{
DateTime returnValue = new DateTime();
DateTime.TryParse(dateToBeParsed, GetCulture(), System.Globalization.DateTimeStyles.AssumeLocal , out returnValue);
return returnValue;
}
}
对于类名,我正在使用这种正则表达式:(?< = class \ s)[^ \ s] +用于我尝试这样的方法: [^ \ s] +(?=(),但这会选择所有(>的文字。对于方法,我需要选择(和访问器如public,private和protected。如何在不进行最终匹配的情况下进行此操作?我只需要括号内的方法名称和参数。
答案 0 :(得分:3)
修改:使用此Regex
(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>\w+)\s+(?<parameter>\w+)\s*,?\s*)+\)
并获取名为methodName
和parameterType
以及parameter
的小组。
您的代码可以是这样的:
var inputString0 = "public void test(string name, out int value)\r\nvoid test(string name, int value)";
foreach (Match match in Regex.Matches(inputString0, @"(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>[\w\?\[\]]+)\s+(?<parameter>\w+)\s*,?\s*)+\)"))
{
var methodName = match.Groups["methodName"].Value;
var typeParameterPair = new Dictionary<string, string>();
int i = 0;
foreach (var capture in match.Groups["parameterType"].Captures)
{
typeParameterPair.Add(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value);
i++;
}
}
答案 1 :(得分:3)
如何使用反射?
class Program
{
static void Main(string[] args)
{
string assemblyName = Path.Combine(Path.GetTempPath(), string.Format("temp{0}.dll", Guid.NewGuid()));
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters compilerParameters = new CompilerParameters(new string[]
{
"System.dll",
"Microsoft.CSharp.dll",
}, assemblyName);
CompilerResults cr = codeProvider.CompileAssemblyFromSource(compilerParameters, File.ReadAllText("Program.cs"));
if (cr.Errors.Count > 0)
{
foreach (CompilerError error in cr.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
else
{
AppDomain appDomain = AppDomain.CreateDomain("volatile");
Proxy p = (Proxy)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Proxy).FullName);
p.ShowTypesStructure(assemblyName);
AppDomain.Unload(appDomain);
File.Delete(assemblyName);
}
Console.ReadLine();
}
}
public class Proxy : MarshalByRefObject
{
public void ShowTypesStructure(string assemblyName)
{
Assembly assembly = Assembly.LoadFrom(assemblyName);
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
Console.WriteLine(type.Name);
MethodInfo[] mis = type.GetMethods();
foreach (MethodInfo mi in mis)
{
Console.WriteLine("\t" + mi.Name);
}
}
}
}
答案 2 :(得分:1)