анализатор roslyn для поиска классов, которые наследуются от типов generi c - PullRequest
2 голосов
/ 02 марта 2020

Я пишу анализатор 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);

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...