Можно ли вернуть код метода (в виде строки) с использованием делегатов в C #? - PullRequest
1 голос
/ 07 марта 2012

Я приведу пример, так как я не уверен, правильно ли я задаю вопрос (английский не является моим основным языком, плюс я все еще изучаю C #).

Я начал изучать Project Euler и решил создать приложение, которое отслеживало бы мои результаты и проверяло мои маленькие знания C #.

В определенном классе у меня есть статические функции, которые используются для решения каждой из проблем.

static class Answers()
{
  public static string A1(){...}
  public static string A2(){...}
  public static string A3(){...}
  //it goes on
}

Проблемные объекты будут создаваться следующим образом (определение класса проблемы и создание объекта во время выполнения).

class Problem
{
  public string Description;
  public Solution SolutionFinder;

  public Problem(string Desc, Solution Solver)
  {
    this.Description = Desc;
    this.SolutionFinder = Solver;
  }

  public delegate string Solution();

  public string SolveProblem()
  {
    return SolutionFinder.Invoke();
  }
}

Это мой код создания формы:

{
  ...
  List<Problem> Euler = new List<Problem>();
  Euler.Add(new Problem("Find the sum of all the multiples of 3 or 5 below 1000.", Answers.A1));
  Euler.Add(new Problem("By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.", Answers.A2));
  Euler.Add(new Problem("What is the largest prime factor of the number 600851475143 ?", Answers.A3));
  ...
}

Я заставил классы и даже делегатов работать правильно, и я в восторге от этого. Тогда я наконец решил показать все это в форме. Я пытаюсь показать следующее: описание проблемы (это сделано) и код для каждого метода (независимо от того, находится ли он внутри A1, A2 и т. Д.) Всякий раз, когда я решаю проблему, используя свою форму.

Это ясно? Просто я хочу, чтобы моя форма показала результат, и как Я получил решение для каждой проблемы, но без необходимости перепечатывать содержимое каждого метода только для отображения - методы уже есть.

И, пожалуйста, не обращайте внимания на грязный код и чрезмерное использование публичных участников: я понимаю, что это плохая практика, но сейчас я просто пытаюсь пройти через этот личный проект, и я считаю, что это нормально, так как здесь это всего лишь небольшой опыт обучения.

Спасибо.

[EDIT] Формат, который я ищу:

void UpdateForm(int Current)
{
  Problem CurrentProblem = Euler[Current-1];
  string Desc = CurrentProblem.Description;
  string Code = CurrentProblem.SolutionFinder.Method.ReturnType.Name;
  //I got this far, but I need to display more than just the name of the method!
  ...
}

Для уточнения

Учитывая метод:

public static string A1() {
    var answer = 1 + 1;
    return answer.ToString();
}

Можно ли получить следующие строки в строке ..?

var answer = 1 + 1;
return answer.ToString();

Ответы [ 5 ]

3 голосов
/ 08 марта 2012

Хотя это не самый причудливый подход, если вы установите значение «Копировать в выходной каталог» на «Копировать всегда» (или «Копировать, если новее») через Свойства исходного файла (щелкните правой кнопкой мыши / Свойства), вы может анализировать файл кода самостоятельно, одновременно оптимизируя его под стиль кодирования.

Кроме того, знаете ли вы, что вы в основном перестраиваете NUnit, помимо дампа исходного кода?

2 голосов
/ 08 марта 2012

Поскольку во время выполнения код написан на IL (промежуточный язык), у вас фактически нет читаемого кода.
В любом случае, вы можете использовать отражение для создания декомпилятора на лету или использовать стороннюю библиотеку.как этот или этот для декомпиляции методов ... но я не знаю, предоставляют ли они какой-либо API, я просто знаю их как инструменты GUI.

1 голос
/ 07 марта 2012

Вы можете подумать о хранении ваших решений (исходного кода) в текстовых файлах ... (например, Problem1.projecteuler, ProblemN.projecteuler) и загрузке этих текстовых файлов как для отображения, так и для стиля плагинов компиляции / выполнения. Проверьте System.Reflection пространство имен и выполните некоторые веб-поиски «Учебник по плагину C #» или что-то подобное, чтобы начать.

0 голосов
/ 08 марта 2012

Нет простого способа запустить код (т.е. содержимое метода) из строки, поскольку C # уже скомпилирован до запуска исполняемого файла.

Тем не менее, есть некоторые приемы, которые вы можете сделать с помощью Reflection and Diagnostics, но для этого необходимо запустить код в режиме отладки. Если это просто маленькое приложение, это не должно быть проблемой. Но при работе в режиме отладки большие приложения испытывают проблемы с производительностью.

Для получения дополнительной информации: Выполнить строку в C # 4.0

0 голосов
/ 07 марта 2012

valeriano ваши статические методы могут быть выражениями Linq, тогда вы можете выполнять итерацию по каждому узлу выражения.Использование Reflection тоже работает, но вам нужно больше кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...