C#:

2010-01-21 6 views
5

Bir dize değişkeni içinde saklanan bir işlevi yürütme Bir dizeden rasgele yöntemleri yürütecek C# 'da basit ve hızlı bir işlev yazmak mümkün mü? Örneğin, MyString = "MessageBox.Show (" Bazı İleti ")" yi ayarlar ve sonra ExecuteString (MyString) öğesini çağırırsam, içindeki "Bazı İletiler" ile bir ileti kutusu açılır. C#:

(. Muhtemelen henüz C# bilmiyorum yukarıdaki kodda hata çeşit yaptık, belirli bir proje için uygun olup olmayacağını değerlendirmek için çalışıyorum.)

+2

emin değil, ancak büyük olasılıkla C# repl için bir yol arıyorsanız, ve iyi bir soru var Bunun hakkında http://stackoverflow.com/questions/1038106/ veya burada http://stackoverflow.com/questions/2058715/ adresinde bazı fikirler/kaynak kodu sunabilir. –

cevap

2

Alas, C# bu şekilde dinamik bir dil değildir. Bunu gerçekten kolayca yapamazsınız ve yapmanız gereken gerçekten bir şey varsa, IronPython veya IronRuby gibi ihtiyaçlarınıza uygun bir Net dili kullanmayı düşünün.

Mevcut en iyi alternatif this forum thread gösterileri bu gerçekten dolambaçlı ve iğrenç bir örnek olarak, CodeDom ad kullanmaktır:

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}); 
      } 
     } 
    } 
} 
+0

Yapabilirsin. Sadece nasıl yayınladım, aynı zamanda kendim de yaptım. –

+1

Sadece _easy_ değildi, _possible_ değildi demedim. Bahsettiğiniz MSDN örneğinin - ki tek bir kod satırı "yürütmek" için 100'den fazla satır gerektiren, sizin için kolay olduğunu düşündüğünden emin değilim. –

3

Bunu kullanmayı ve içine bir dize çalıştırmak için gereken kod sarmak gerekir bir işlev.

Temelde yaptığınız şey, Program.Main stil işlevinde küçük C# kodunun bitmesini, temel işlevler için bazı derlemeleri (belki de kendi derlemenizi dahil ederek) silmektir, sonra derlenmiş programı bellekte çalıştırır.

Muhtemelen bir ya da iki satırlık kod çalıştırmanız gerekenden biraz daha fazla yük olabilir.

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

+0

Anlaşmalı - en iyi alternatif, bu tür işleri IronPython veya IronRuby'ye yapmaktır. –

+0

Evet, bu kadar küçük miktarlarda "script kodu" için hafif betik tabanlı yöntemler kullanmak daha iyi olurdu. –

+0

Bir bağlam gerekiyorsa, örneğin çalışma zamanı değişkenlerine ve ana bilgisayar uygulamasındaki sınıflara erişim, ironPython veya diğer DLR dillerinden daha çok kod dizesinden daha iyidir. Veya kod dizesi, derleme derlemesinden daha sık değişiyorsa, derleme oluşturmak iyi bir seçenek değildir. Değerlendirmeye ihtiyaç duyan her kod dizesi için derleme. – affan

3

ne arıyorsun gibi görünen bu aynısı olup olmadığını CS-Script