首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ># roslyn中的if指令代码解析

# roslyn中的if指令代码解析
EN

Stack Overflow用户
提问于 2016-11-09 08:42:25
回答 1查看 657关注 0票数 1

我试图使用Roslyn从我的CS文件中提取代码的一部分,我遇到了下面的问题。

我的C#文件代码:

代码语言:javascript
复制
    class ConditionalCompilationCode
    {
#if Condition2
            int test2=0; 
#endif
#if Condition1
            int test1=0; 
#endif

        public static void Main1(string[] args)
        {
            int test = 0;
#if Condition1
            test = 1;
#else
            test =2;
#endif

#if Condition2
            test =3;
#else
            test = 4;
#endif

        }
#if Condition2
            private void testmethod1()
        {
            test2 = 1;
        }
#endif
#if !Condition2
        private void testmethod2()
        {
            test1 = 1;
        }
#endif
#if Condition1
        private void testmethod3()
        {
            test1 = 1;
        }
#endif
#if !Condition1
            private void testmethod4()
        {
            test2 = 1;
        }
#endif
    }
}

我的罗斯林代码:

代码语言:javascript
复制
string fileContent = File.ReadAllText(fileName);

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(fileContent);

var syntaxRootNode = syntaxTree.GetRoot();
            if (syntaxRootNode.GetFirstToken().Kind() == SyntaxKind.None)
                return;
            foreach (NamespaceDeclarationSyntax namespaceSyntax in syntaxRootNode.DescendantNodes().OfType<NamespaceDeclarationSyntax>().ToArray())
            {

                IEnumerable<SyntaxNode> nodeList = namespaceSyntax.ChildNodes();
                string className = null;
                foreach (SyntaxNode syntaxNode in nodeList)
                {
                    SyntaxKind kind = syntaxNode.Kind();
                    switch (kind)
                    {
                        case SyntaxKind.ClassDeclaration:
                            UpdateClassSignature(syntaxNode as TypeDeclarationSyntax);                            
                            break;
                        case SyntaxKind.EnumDeclaration:

                            break;
                        case SyntaxKind.InterfaceDeclaration:

                            break;
                        case SyntaxKind.StructDeclaration:

                            break;

                    }

                }

            }

    private void UpdateClassSignature(TypeDeclarationSyntax classDeclarationSyntax)
        {

            foreach (MemberDeclarationSyntax member in classDeclarationSyntax.Members)
            {
                SyntaxKind kind = member.Kind();
                switch (kind)
                {
                    case SyntaxKind.FieldDeclaration:
                        break;
                    case SyntaxKind.PropertyDeclaration:
                        break;
                    case SyntaxKind.MethodDeclaration:
                    case SyntaxKind.ConstructorDeclaration:
                    case SyntaxKind.DestructorDeclaration:
                        break;
                    case SyntaxKind.IndexerDeclaration:
                        ExtractIndexer(member as IndexerDeclarationSyntax, classSign);
                        break;
                    case SyntaxKind.DelegateDeclaration:
                        //TODO: Add Delegate Support.
                        break;
                    case SyntaxKind.OperatorDeclaration:
                    case SyntaxKind.ConversionOperatorDeclaration:
                        //Skip.
                        //TODO: Need to add operator suport.
                        break;
                    case SyntaxKind.EventFieldDeclaration:
                        //TODO: Add support to event.
                        break;
                    case SyntaxKind.EventDeclaration:
                        //TODO: Add support to event.
                        break;
                    case SyntaxKind.EnumDeclaration:
                        break;
                    case SyntaxKind.ClassDeclaration:
                        break;
                    case SyntaxKind.StructDeclaration:
                        break;
                    default:
                        break;
                }
            }
        }

在使用roslyn处理上述CS文件时,classDeclarationSyntax.Members中包含以下三个值:

  1. MethodDeclarationSyntax MethodDeclaration 公共静态无效Main1(string[] args) { int test = 0;#if Condition1 test = 1;#else test =2;#endif #if Condition2 test =3;#Condition2 test = 4;#endif }
  2. MethodDeclarationSyntax MethodDeclaration 私有void testmethod2() { test1 = 1;}
  3. MethodDeclarationSyntax MethodDeclaration 私有void testmethod4() { test2 = 1;}

我的项目只有"Condition1“指令。只有当条件只有"Condition1“时,你才能帮助我获得密码吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 15:36:09

您需要传递一个CSharpParseOptions,该WithPreprocessorSymbols()调用WithPreprocessorSymbols()将要定义的符号传递给解析器。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40502796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档