我想从字符串中检测类。
示例;
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
并且必须使用泛型。
答案 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);
}