Как я могу добавить метод к моему классу из-за времени выполнения? - PullRequest
1 голос
/ 22 сентября 2019

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

Я уже нашел несколько ссылок и примеров, таких как CodeDomProvider, CSharpCodeProvider и DynamicMethod, но кажется, что они могут только создавать новые исполняемые файлы (exe-файлы) или создавать пресеты, которые можно выполнитьс новыми параметрами.

Мне нужен способ создания нового метода в моем существующем классе или способ взаимодействия с моим существующим классом.Я уже думал о плагинах, но, по моему мнению, было бы много работы для создания плагина для каждого метода, а также неэффективно, я прав?

Вы также можете узнать лучший способ, чем создавать методы для каждой команды?

Редактировать 1:

С помощью Assembly.CreateInstane("path"); я мог бы «клонировать» мою работающую программу, и вместе с CSharpCodeProvider я мог бы создать новый exe-файл с помощью этих методов.Но есть проблема.Когда я использую метод, в котором нет ссылки на класс, например using System.Windows.Forms, выдает ошибку:

Строка № 3, номер ошибки: CS0234, «Имя типа или пространства имен« Windows »не существует в пространстве имен 'System'.(Ссылка на сборку отсутствует?);

Это был бы мой тест-код прямо сейчас:

//The String I am going to Add through my textfield
using System;
using System.Reflection;
using System.Windows.Forms;

public class Example
{
   public static void Main()
   {
      Assembly assem = typeof(View).Assembly;
      View v = (View ) assem.CreateInstance("Usopis");
      if (! (v == null)) {
         v.Height = 300;
         MessageBox.Show("Instantiated a {0} object whose value is '{1}'",
                           v.GetType().Name, v);
      }
      else {
         MessageBox.Show("Unable to instantiate a View object.");
      }   
   }
}
//Code which should compile my String to a exe

private void Button_Click(object sender, EventArgs e) {
    textBox2.Text = "";
    CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
    CompilerParameters parameters = new CompilerParameters();
    parameters.GenerateExecutable = true;
    CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);

    if(results.Errors.Count > 0) {
        textBox2.ForeColor = Color.Red;
        foreach(CompilerError CompErr in results.Errors) {
            textBox2.Text = textBox2.Text +
                        "Line number " + CompErr.Line +
                        ", Error Number: " + CompErr.ErrorNumber +
                        ", '" + CompErr.ErrorText + ";" +
                        Environment.NewLine + Environment.NewLine;
        }
    } else {
        //Successful Compile
        textBox2.ForeColor = Color.Blue;
        textBox2.Text = "Success!";
    }
}

1 Ответ

0 голосов
/ 22 сентября 2019

Чтобы исправить пропущенную ошибку пространства имен, вы должны добавить недостающую ссылку:

parameters.ReferencedAssemblies.Add("System.Web.dll");

Но это не решит всех ваших проблем.
Может быть, загляните в Lamdas ...
Это может быть что-то для вас:
https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/

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