如何从字符串中获取类名?

时间:2016-01-14 13:33:00

标签: c# reflection

我想从字符串中检测类。

示例;

string test = "class Test { string Name; string PassWord;}"    
string[] classNames = GetClassNamesFromString(test);   
//Now string[0] has to be Test

或者更复杂

string test = "[Export(typeof(ITest))]public class Test : ITest { }"    
string[] classNames = GetClassNamesFromString(test);   
//Now string[0] has to be Test

并且必须使用泛型。

3 个答案:

答案 0 :(得分:0)

试试这个:

var input = "public class MyClass {//whatever}";    
var regex = new Regex(@"class\s(\w+)\s*[{,:]", RegexOptions.Compiled);  
var result = regex.Match(input);    
var className = result.Groups[1].Value;

如果多次运行,请使用RegexOptions.Compiled并将regex存储在实例变量中以获得更好的性能,否则您可以删除该标志。

我让你处理错误处理,不要忘记写一些测试条件等我没有添加对泛型的支持我也留给你探索REGEX的精彩。

答案 1 :(得分:0)

我会简单地使用正则表达式。

  

类\ S +(\ W + \ d *)+

在那个方面:

string test = "[Export(typeof(ITest))]public class Test : ITest { }";
var match = Regex.Match(test, @"class\s+(\w+\d*)+");
string classname = match.Value.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)[1];

它甚至可以在类和名称之间使用大量空间:

string test = "[Export(typeof(ITest))]public class         Test : ITest { }";

答案 2 :(得分:0)

我解决了这个问题;

using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

    var t = CSharpSyntaxTree.ParseText(@"
        using System;
        namespace Muhterem
        {
            class Main
            {   
                static void Main(string[] args)
                {
                    Hello();
                }
                static void Hello()
                {
                    Console.WriteLine();
                }
            }   
            class Generic<T>
            {}
            abstract class AbstractClass
            {}
        }
        ");

        var roo = t.GetRoot();
        var classes = roo.DescendantNodes().OfType<ClassDeclarationSyntax>();
        foreach (var y in classes)
        {
            Console.WriteLine(y.Identifier);
        }

和输出; enter image description here