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

そのためにReflectionを使用できます。

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タイプのみがあります。しかしとにかく-Reflectionを使用して、これらのタイプからプロパティやメソッドなどを取得できるようになりました。

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 に答える