Действительно ли возможно записать простую и быструю функцию в C#, который выполнит произвольные методы от строки? Например, если я установил MyString = "MessageBox. Покажите ("Некоторое сообщение")" и затем назовите ExecuteString (MyString), окно сообщения открылось бы с "Некоторым сообщением" в нем.
(Я, вероятно, совершил своего рода ошибку в вышеупомянутом коде. Я еще не знаю C#; я пытаюсь оценить, подходило ли это для определенного проекта.)
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});
}
}
}
}
Вы должны быть в состоянии использовать это и завернуть код, необходимый для запуска строки в функцию.
По сути, то, что вы делаете, это обертывает небольшой бит кода C # в программе программа. Main
функция стиля, ссылаясь на некоторые сборки для основных функций (возможно, включая вашу собственную сборку), затем запустить сборкущую программу в объем памяти.
Это, вероятно, немного больше накладных расходов, чем вам нужно просто запустить одну или две строки кода.