C#: выполните функцию, сохраненную в строковой переменной

Действительно ли возможно записать простую и быструю функцию в C#, который выполнит произвольные методы от строки? Например, если я установил MyString = "MessageBox. Покажите ("Некоторое сообщение")" и затем назовите ExecuteString (MyString), окно сообщения открылось бы с "Некоторым сообщением" в нем.

(Я, вероятно, совершил своего рода ошибку в вышеупомянутом коде. Я еще не знаю C#; я пытаюсь оценить, подходило ли это для определенного проекта.)

5
задан JoeS 21 January 2010 в 05:29
поделиться

2 ответа

ALAS, C # не является динамическим языком таким образом. Вы не можете легко сделать это легко, и если это действительно то, что вам нужно сделать, рассмотрите возможность использования языка .NET больше в соответствии с вашими потребностями, как Ironpython или Ironruby.

Ваша лучшая доступная альтернатива - использовать пространство имен Codedom, как этот действительно запутанный и отвратительный пример из этого форума показывает:

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SampleLib.SampleType test = new SampleLib.SampleType();

        private void button1_Click(object sender, EventArgs e)
        {
            // Dynamically build and call the method
            label1.Text = test.MyText;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StringBuilder DynamicCode = new StringBuilder();
            DynamicCode.Append("namespace TestDynamic");
            DynamicCode.Append("{");
            DynamicCode.Append("public class DynamicCode");
            DynamicCode.Append("{");
            DynamicCode.Append("public static void EditText(SampleLib.SampleType t)");
            DynamicCode.Append("{");
            DynamicCode.Append("t.MyText = \"Goodbye!\";");
            DynamicCode.Append("}");
            DynamicCode.Append("}");
            DynamicCode.Append("}");

            string CodeString = DynamicCode.ToString();

            System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
            CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            CompilerParameters CompileParams = new CompilerParameters(new string[] { fi.DirectoryName + "\\SampleLib.dll" },
                fi.DirectoryName + "\\Dynamic.dll");
            CompileParams.MainClass = "DynamicCode";
            CompileParams.GenerateExecutable = false;
            //CompileParams.GenerateInMemory = true;
            CompilerResults r = provider.CompileAssemblyFromSource(CompileParams, new string[] {CodeString});
            foreach (CompilerError er in r.Errors)
            {
                Console.WriteLine(er.ErrorText);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // Dynamically call assembly
            System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
            Assembly dynAsm = Assembly.LoadFile(fi.DirectoryName + "\\Dynamic.dll");
            if (dynAsm != null)
            {
                object o = dynAsm.CreateInstance("TestDynamic.DynamicCode", true);
                Type t = dynAsm.GetType("TestDynamic.DynamicCode");
                t.GetMethod("EditText").Invoke(o, new object[]{test});
            }
        }
    }
}
2
ответ дан 14 December 2019 в 04:38
поделиться

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

По сути, то, что вы делаете, это обертывает небольшой бит кода C # в программе программа. Main функция стиля, ссылаясь на некоторые сборки для основных функций (возможно, включая вашу собственную сборку), затем запустить сборкущую программу в объем памяти.

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

http://support.microsoft.com/kb/304655

3
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: