- Строка — это имя существующего метода. в том же содержащем типе.
- Метод принимает один параметр, соответствующий типу свойства (атрибут можно применять только к свойствам).
- Возврат тип метода — bool, Task, CustomValidationResult или Task
Для сравнения мне удалось найти вспомогательный метод:
Код: Выделить всё
static bool TypeSymbolMatchesType(ITypeSymbol typeSymbol, Type type, SemanticModel semanticModel)
{
return GetTypeSymbolForType(type, semanticModel).Equals(typeSymbol);
}
static INamedTypeSymbol GetTypeSymbolForType(Type type, SemanticModel semanticModel)
{
if (!type.IsConstructedGenericType)
{
return semanticModel.Compilation.GetTypeByMetadataName(type.FullName);
}
// get all typeInfo's for the Type arguments
var typeArgumentsTypeInfos = type.GenericTypeArguments.Select(a => GetTypeSymbolForType(a, semanticModel));
var openType = type.GetGenericTypeDefinition();
var typeSymbol = semanticModel.Compilation.GetTypeByMetadataName(openType.FullName);
return typeSymbol.Construct(typeArgumentsTypeInfos.ToArray());
}
И это работает для bool и Task, но когда я пытаюсь получить информацию о типе CustomValidationResult, анализатор, похоже, даже не запускается. Соответствующий код выглядит следующим образом:
Код: Выделить всё
private void AnalyzePropertySyntax(SyntaxNodeAnalysisContext context)
{
var propertyDeclaration = (PropertyDeclarationSyntax)context.Node;
context.ReportDiagnostic(Diagnostic.Create(Feedback, context.Node.GetLocation(), $"Total In List: {propertyDeclaration.AttributeLists.Count}"));
try
{
...
...
context.ReportDiagnostic(Diagnostic.Create(Feedback, context.Node.GetLocation(), "Matching Return..."));
var returnType = methodSymbol.ReturnType;
var matchBool = TypeSymbolMatchesType(returnType, typeof(bool), context.SemanticModel);
var matchBoolTask = TypeSymbolMatchesType(returnType, typeof(Task), context.SemanticModel);
var type = typeof(object);
throw new InvalidOperationException($"Type Info: {type}");
}
catch (Exception ex)
{
context.ReportDiagnostic(Diagnostic.Create(Exception, context.Node.GetLocation(), ex.ToString()));
}
}
Я ожидал увидеть сообщение «Всего в списке...», поскольку оно всегда должно выводиться. Кроме того, если было исключение (которое должно быть, поскольку я пытаюсь его создать), но об исключении никогда не сообщается.
Это первый случай. Раз я пытаюсь создать диагностический анализатор, поэтому уверен, что упускаю что-то простое, но застрял на этом на несколько часов. Любой помощник/руководство будет принят с благодарностью. ТИА.
Подробнее здесь: https://stackoverflow.com/questions/793 ... rmation-of
Мобильная версия