我正在嘗試使用roslyn編寫代碼分析規則。檢查ObjectCreationExpressionSyntax的參數是否包含在try catch塊中
基本上,我必須檢查一個Microsoft.Practices.Prism.Commands.DelegateCommand()
創建的每個參數是否包裝在try catch
或不包含。
主要的想法是收集DelegateCommand
類的所有ObjectCreationExpressionSyntax
對象和檢查每個構造函數的參數,如果第一StatementSyntax
是TryStatementSyntax
與否。
你能幫我把StatementSyntax
從ArgumentSyntax
?或者你可能有另一種方法?
public IEnumerable<IdentifierInfo> Collect(SyntaxNode rootNode, SemanticModel semanticModel)
{
ObjectCreationExpressionSyntax[] objCreation = rootNode
.DescendantNodes()
.OfType<ObjectCreationExpressionSyntax>()
.Where(c=>(c.Type as IdentifierNameSyntax)?.Identifier.Value.ToString() == "DelegateCommand")
.ToArray();
foreach (var obj in objCreation)
{
var args = obj.ArgumentList.Arguments;
foreach (ArgumentSyntax arg in args)
{
var expession = arg.Expression;
var symbol = semanticModel.GetSymbolInfo(expession).Symbol as IMethodSymbol;
}
}
}
婁你可以找到我其實編譯尋遍:
public class Program
{
public delegate void MyDelegate();
public static void DelegateMethod() { try { } catch { } }
public static void Main(string[] args)
{
DelegateCommand del1 = new DelegateCommand(() => {try{}catch{}});
DelegateCommand del2 = new DelegateCommand(new Action(() => { }));
DelegateCommand del3 = new DelegateCommand(DelegateMethod);
var barInit = (Action)(DelegateMethod);
DelegateCommand del4 = new DelegateCommand(barInit);
ICommand test;
test = new Microsoft.Practices.Prism.Commands.DelegateCommand(() => { });
}
}
這是PRISM 5或以上?那麼你可能也想處理'DelegateCommand.FromAsync()'變體,不是嗎? – Ties