public static SomeReturnType GetSomething(string param1,int param2)
我需要能够解析它并获得上面的信息.所以在这种情况下
> name =“GetSomething”
> scope =“public”
> isStatic = true
> returnType =“SomeReturnType”
然后是参数类型和名称对的数组.
哦差点忘了最重要的部分.它必须考虑所有其他范围(受保护,私有,内部,受保护的内部),缺少“静态”,无效返回类型等.
请注意,REFLECTION不是解决方案.我需要REGEX.
到目前为止,我有这两个:
(?:(?:public)|(?:private)|(?:protected)|(?:internal)|(?:protected internal)\s+)* (?:(?:static)\s+)*
我猜其余的问题我可以在没有正则表达式的情况下使用字符串操作.
解决方法
一组可以由特定正则表达式匹配的字符串称为常规语言.在任何C#版本中,作为合法方法声明的字符串集不是常规语言.如果您试图找到一个匹配每个合法C#方法声明的正则表达式并拒绝每个非法的C#方法声明,那么您就不走运了.
更一般地说,除了最简单的匹配问题之外,正则表达式几乎总是一个坏主意. (对不起杰夫.)更好的方法是先写一个词法分析器,将字符串分解为一系列标记.然后分析令牌序列. (使用正则表达式作为词法分析器的一部分并不是一个可怕的想法,尽管没有它们可以顺利完成.)
我还注意到,您在解析方法声明时遇到了很多复杂问题.你没有提到:
> generic / array / pointer / nullable return和formal参数类型
>泛型类型参数声明
>泛型类型参数约束
> unsafe / extern / new / override / virtual / abstract / sealed方法
>显式接口实现方法
>方法/参数/返回属性
>部分方法 – 解析时有点棘手,partial是上下文关键字
>评论
我还注意到,你没有说过你是否保证方法签名已经很好,或者你是否需要识别不良方法并产生诊断,说明它们为什么不好.这是一个更难的问题.
你为什么要首先这样做?正确地做这件事是相当多的工作.也许有一种更简单的方法来获得你想要的东西?