2016-10-25 2 views
-1

Я пытаюсь извлечь полный метод, который находится внутри файла cs. , например .. Предположим, у нас есть класс, как это ...Как извлечь полный метод внутри класса?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
namespace GetMethodNm 
{ 
class MyClass 
{ 

    public int ComplexMethod(int param1, int myCustomValue) 
    { 
     if (param1 == myCustomValue) 
     { 
      return 54; 
     } 
     else 
     { 
      return 0; 
     } 
    } 

    public string ComplexMethodV(int param1, int myCustomValue) 
    { 
     if (param1 < myCustomValue) 
     { 
      return "300"; 
     } 
     else 
     { 
      return "My custom value to return"; 
     } 
    } 

    public bool ComplexMethodX(int param1, int myCustomValue) 
    { 
     if (param1 == myCustomValue) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
} 

Тогда мне нужно извлечь метод чтения файла CS ComplexMethodV .. Как я могу это сделать? Я попытался с отражением, но я могу получить только имя и некоторые вещи внутри него .. но мне понадобился бы буквальный метод внутри.

+0

Вы хотите прочитать исходный код? Почему бы просто не прочитать сам файл с помощью 'FileStream'? – HimBromBeere

+0

Вы хотите прочитать полное определение? –

+0

Вы хотите вызвать метод или что-то еще? Вы хотите, чтобы все параметры были четкими до выполнения или? В чем цель? Иногда, если вы даете больше информации, люди могут помочь вам лучше. – Younes

ответ

2

Использование задач Roslyn, как это, относительно легко. В проекте добавить пакет NuGet Microsoft.CodeAnalysis.CSharp, а затем просто использовать следующий код

using System; 
using System.IO; 
using System.Linq; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 

namespace SandboxConsole 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      var text = File.ReadAllText("MyClass.cs"); 
      var tree = CSharpSyntaxTree.ParseText(text); 

      var method = tree.GetRoot().DescendantNodes() 
         .OfType<MethodDeclarationSyntax>() 
         .First(x => x.Identifier.Text == "ComplexMethodV"); 

      Console.WriteLine(method.ToFullString()); 
      Console.ReadLine(); 
     } 
    } 
} 

Это выводит тексту

 public string ComplexMethodV(int param1, int myCustomValue) 
     { 
      if (param1 < myCustomValue) 
      { 
       return "300"; 
      } 
      else 
      { 
       return "My custom value to return"; 
      } 
     } 

См the Wiki для более продвинутых учебных пособий о том, как сделать что-то вроде синтаксического анализа целых решений.

+0

Спасибо за это .. Есть ли способ изменить этот метод и заменить узел на дерево? Любая подсказка будет приветствоваться. – Pablo

+0

Да, [есть вся прогулка по нему в вики] (https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Transformation) –

Смежные вопросы