मैं के बराबर करना चाहते हैं: के बाद Biri रों linkमैं गतिशील रूप से सी # अभिव्यक्ति का मूल्यांकन कैसे कर सकता हूं?
object result = Eval("1 + 3");
string now = Eval("System.DateTime.Now().ToString()") as string
, मैं इस स्निपेट (अप्रचलित विधि ICodeCompiler.CreateCompiler()
दूर करने के लिए संशोधित मिला:
private object Eval(string sExpression)
{
CSharpCodeProvider c = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
StringBuilder sb = new StringBuilder("");
sb.Append("using System;\n");
sb.Append("namespace CSCodeEvaler{ \n");
sb.Append("public class CSCodeEvaler{ \n");
sb.Append("public object EvalCode(){\n");
sb.Append("return " + sExpression + "; \n");
sb.Append("} \n");
sb.Append("} \n");
sb.Append("}\n");
CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());
if (cr.Errors.Count > 0)
{
throw new InvalidExpressionException(
string.Format("Error ({0}) evaluating: {1}",
cr.Errors[0].ErrorText, sExpression));
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
यह आवश्यक क्यों है? मुझे बहुत संदेह है कि जो भी उद्देश्य आप चाहते हैं उसके लिए यह सबसे अच्छा डिजाइन है। संभावित रूप से अधिक संभावनाएं उत्पन्न करने के लिए अन्य तंत्र हैं जो आप चाहते हैं कि वेड़े की भारी मात्रा (सुरक्षा और रखरखाव के लिए) खोलने के बिना रन टाइम पर कोड स्निपेट का मूल्यांकन कर रहे हों। – Wedge
मैंने लिखा एक डीएसएल को अभिव्यक्ति सत्यापन जोड़ने के लिए एक त्वरित और गंदा तरीका चाहता था। मैं मूल्यांकनकर्ता को खिलाया जा रहा फाइलों को नियंत्रित करता हूं, इसलिए कीड़े का खंभा कभी नहीं खोला जाता है;) इसके अलावा, मैं केवल एक अभिव्यक्ति की अनुमति देता हूं, किसी भी नामस्थान/किसी भी असेंबली को संदर्भित नहीं करता हूं। यह खुद को नुकसान पहुंचाने से रोकना चाहिए! –
मैं परीक्षण परिदृश्य में ऐसा करता हूं। मेरे पास एक असेंबली है जो संस्करण संख्याओं को बदलती है क्योंकि इसे अपडेट किया जाता है। मैं चाहता हूं कि मेरा टेस्ट कोड असेंबली को "देर से बाध्य" हो - असेंबली लोड करने में सक्षम हो और गतिशील रूप से कॉल करें। यह प्रतिबिंब का एक साधारण मामला है। लेकिन जब मैं असेंबली में निर्दिष्ट इंटरफ़ेस को कार्यान्वित करना चाहता हूं, तो उसे कोड के गतिशील संकलन की आवश्यकता होती है, क्योंकि इंटरफ़ेस स्वयं दृढ़ता से नामित होता है (संस्करण संख्या के साथ)। मेरे पास कोड नहीं हो सकता है जो IFoo v1.2 लागू करता है जब मैं v1.3 का आह्वान करना चाहता हूं। गतिशील संकलन इस पते को संबोधित करता है। – Cheeso