我正在尝试验证用户提供的脚本 - 基于 C# 语法。 我只想接受处理基本数学运算和我控制的一些函数的脚本。我不能允许任何类型的 .DoSomething() 表示法。 例如,用户可以这样做: String.ToUpper("foo"),但不是 "foo".ToUpper() - 我需要控制我允许从这些执行的所有内容。请注意,我有自己的 String.ToUpper 实现 - 仅调用底层 .net,但它必须通过我的外观。
我不确定访问者应该使用什么语法来完成这样的事情。有没有一种简单的方法可以做到这样的事情:标记不是来自实现我控制的特定标记接口的类的any方法调用?
基本上,如果我要尝试执行用户提供的代码,我想绝对确保只能执行一组特定的操作。
蒂亚
我自己解决了(到目前为止)。这看起来像是找到所有调用并验证实现该方法的类型是否继承自我的接口。这有什么问题吗?
var invocationExpressionVisitor = new InvocationExpressionVisitor();
invocationExpressionVisitor.Visit(root);
var invocations = invocationExpressionVisitor.Invocations;
foreach (InvocationExpressionSyntax invocation in invocations)
{
ISymbol symbol = model.GetSymbolInfo(invocation).Symbol;
if (symbol != null)
{
INamedTypeSymbol containingType = symbol.ContainingType;
if (containingType.Interfaces.All(i => i.MetadataName != nameof(ISomeControlledInterface)))
{
ValidationMessages.Add("Expression uses disallowed method invocations.");
}
}
}