Я пишу анализатор Rosyln с использованием VS 2019. Я хочу, чтобы он нашел все классы, которые наследуются от MyNameSpace.MyLib.MyClass или MyNameSpace.MyLib.MyClass и пометил их предупреждением.
Я ищу классы, которые наследуются от MyNameSpace.MyLib.MyClass , но я не могу понять, как понять, что тип экземпляра (например, MyNameSpace.MyLib.MyClass ) a MyNameSpace.MyLib.MyClass
Проблема возникает в следующей строке:
if(InheritsFrom(namedTypeSymbol, myclassOfT) ||
InheritsFrom(namedTypeSymbol, myclassOfTU))
Как это исправить, чтобы она распознавала MyNameSpace.MyLib.MyClass ) как MyNameSpace.MyLib.MyClass ?
Вот код, который я использую, а ниже - тест, с которым я пытаюсь его протестировать.
public override void Initialize(AnalysisContext context)
{
context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
}
private static void AnalyzeSymbol(SymbolAnalysisContext context)
{
var namedTypeSymbol = (INamedTypeSymbol)context.Symbol;
INamedTypeSymbol myclassOfT = context.Compilation.GetTypeByMetadataName("MyNamespace.MyLib.MyClass`1");
INamedTypeSymbol myclassOfTU = context.Compilation.GetTypeByMetadataName("MyNamespace.MyLib.MyClass`2");
if(InheritsFrom(namedTypeSymbol, myclassOfT) || InheritsFrom(namedTypeSymbol, myclassOfTU))
{
... raises diagnostic
}
}
// got InheritsFrom from:
// https://www.meziantou.net/working-with-types-in-a-roslyn-analyzer.htm#checking-a-type-inhe
private static bool InheritsFrom(INamedTypeSymbol symbol, ITypeSymbol type)
{
var baseType = symbol.BaseType;
while (baseType != null)
{
if (type.Equals(baseType))
return true;
baseType = baseType.BaseType;
}
return false;
}
}
А вот и тест:
public class AnalyzerTest : DiagnosticVerifier
{
[TestMethod]
public void ShouldRaiseWarning()
{
var test = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication1
{
public class TypeName : MyNameSpace.MyLib.MyClass<FakeType>
{
public void OneMethod()
{
}
}
public class FakeType
{
}
}
namespace MyNameSpace.MyLib
{
public class MyClass<T>
{
}
public class MyClass<T,U>
{
}
}
";
VerifyCSharpDiagnostic(test);
}