Я пытаюсь написать правило анализа кода с roslyn.Проверьте, включен ли аргумент объекта ObjectCreationExpressionSyntax в блок catch try или нет.
В принципе, я должен проверить, не создается ли каждый из аргументов, который создается Microsoft.Practices.Prism.Commands.DelegateCommand()
, в try catch
или нет.
Основная идея собрать все ObjectCreationExpressionSyntax
объектов DelegateCommand
класса и проверить аргумент каждого конструктора, если первый 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