6

可能重复:
C# 解析器

假设我有一个简单的类,例如在 winforms 应用程序的文本框控件内:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void DoSomething(string x)
    {
        return "Hello " + x;
    }
}

有没有一种简单的方法可以从中解析以下项目:

  • 班级名称
  • 特性
  • 任何公共方法

任何想法/建议表示赞赏。

4

2 回答 2

11

您可以为此使用反射

Type type = typeof(Person);
var properties = type.GetProperties(); // public properties
var methods = type.GetMethods(); // public methods
var name = type.Name;

更新您的第一步是编译您的课程

sring source = textbox.Text;

CompilerParameters parameters = new CompilerParameters() {
   GenerateExecutable = false, 
   GenerateInMemory = true 
};

var provider = new CSharpCodeProvider();       
CompilerResults results = provider.CompileAssemblyFromSource(parameters, source);

接下来,您应该验证您的文本是否是有效的 c# 代码。实际上您的代码无效 - 方法 DoSomething 标记为 void,但它返回一个字符串。

if (results.Errors.HasErrors)
{
    foreach(var error in results.Errors)
        MessageBox.Show(error.ToString());
    return;
}

到现在为止还挺好。现在从已编译的内存程序集中获取类型:

var assembly = results.CompiledAssembly;
var types = assembly.GetTypes();

在您的情况下,只有Person类型。但无论如何 - 现在您可以使用反射从这些类型中获取属性、方法等:

foreach(Type type in types)
{
    var name = type.Name;  
    var properties = type.GetProperties();    
}
于 2012-12-05T14:20:35.807 回答
4

如果您需要在运行时分析 C# 代码,请查看Roslyn

于 2012-12-05T14:24:31.233 回答