PDA

View Full Version : ایجاد کلاس از طریق String



salehbagheri
پنج شنبه 20 فروردین 1388, 20:03 عصر
سلام دوستان!

من یه متغیر از نوع String دارم كه به صورت زیر است!



string strClass;
strClass = "public class className\n{\nstring str;\n ...\n}";


همانطور كه ميبينيد كلاسي در اين متغير ذخيره شده!

چگونه ميشه اين كلاس رو در پروژه خودمون ايجاد كنيم! (به صورت Runtime)

با تشکر!

meysam_pro
پنج شنبه 20 فروردین 1388, 21:30 عصر
کسی نبود جواب بده ؟
منم نیاز دارم.

Mehdi Asgari
پنج شنبه 20 فروردین 1388, 22:12 عصر
سی شارپ فعلا تابع eval یا REPL یا همچین چیزی نداره (امیدواریم! در نسخۀ 5 اضافه بشه. آندرس یه چیزایی می گفت... )
مونو همچین چیزی داره:
http://tirania.org/blog/archive/2008/Sep-10.html
http://mono-project.com/CsharpRepl
البته تو میتونی خودت با Reflection.Emit همچین کاری بکنی (ولی انتظار نداشته باش خیلی ساده باشه)

راستی تاپیکت تکراریه ها! http://barnamenevis.org/forum/showthread.php?t=150811

mostafaaa
پنج شنبه 20 فروردین 1388, 22:45 عصر
سلام دوست من
با استفاده از کلاس ها و اشیای فضا نام CodeDom میشه یه کارهایی کرد من قبلا چندتا مثال توی تالار VB.net گزاشته بودم ، اینم هم به زبان C# شاید بتونه کمکتون کنه.

public object ProcessCommand(String command)
{
CSharpCodeProvider Provider = new CSharpCodeProvider();
CompilerParameters Parameters = new CompilerParameters();
CompilerResults Result;
String Source;
Parameters.GenerateExecutable = false;
Parameters.GenerateInMemory = true;
Parameters.ReferencedAssemblies.Add("System.dll");
Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
Source = "using System;" + Environment.NewLine +
"using System.Windows.Forms;" + Environment.NewLine +
"namespace ns {" + Environment.NewLine +
"public class Class1 {" + Environment.NewLine +
"public static object Evaluate(){" + Environment.NewLine +
"return " + command + Environment.NewLine +
"}" + Environment.NewLine +
"}" + Environment.NewLine +
"}";
Result = Provider.CompileAssemblyFromSource(Parameters, Source);
if (Result.Errors.Count > 0)
{
MessageBox.Show(Result .Errors [0].Line + " " + Result.Errors[0].ErrorText);
}
else
{
MethodInfo Info = Result.CompiledAssembly.GetType("ns.Class1").GetMethod("Evaluate");
return ((object)Info.Invoke(null, null));
}
return null;

}
برای تستش میتونی این رو امتحان کنی :

int result = ((int)ProcessCommand("(5*6)*100-40;"));
MessageBox.Show(result .ToString ());
یا علی