我从已解析的C#脚本中提取了所有InvocationExpressionSyntax
,结果如下:
1. System.IO.Directory.GetDirectories(@"c:\").First()
2. Math.Sin(3).ToString()
3. value.Substring(0, 1)
我也有SemanticModel对象,并以各种方式进行搜索和实验,以执行以下操作:
Math.Sin(3).ToString()
应告诉我该方法为ToString
,而类型为Double
。在下一次迭代中,方法为Sin
,类型为Math
。List<Type> Allowed
的硬编码列表。我现在想要提取CLR Type
的每个细分的InvocationExpressionSyntax
,看看它是否包含在白名单中。目标是列出白名单类型并调用最终用户可以使用的小子集。例如,Math.XXX
没问题,Directory.XXX
不是。
我已经搜索过并进行了相当多的实验,但还没有弄清楚如何针对每个表达式提取Type
对象。预期课程类型为MethodInfo
,PropertyInfo
和Class
。
任何指针都会受到赞赏。
答案 0 :(得分:0)
您是否考虑过使用NDepend代码查询模型? https://www.ndepend.com/features/cqlinq#CQL https://www.ndepend.com/docs/cqlinq-features https://www.ndepend.com/docs/cqlinq-syntax
例如,您可以编写代码查询:
let blackListedMethodNames = new [] {
"System.IO.Directory.XXX",
...
}.ToHashSet()
let blackListedMethods =
Methods.Where(m => blackListedMethodNames.Contains(m.FullName)).ToHashSet()
from m in Application.Methods.UsingAny(blackListedMethods )
select new { m,
blackListedMethodsCalled = m.MethodsCalled.Intersect(blackListedMethods ) }
例如: