天天看點

C#擷取動态代碼的值

通過字元串對控件屬性指派

例如:"BackColor=Color.FromArgb(100,100,100);BackGroundp_w_picpath=Image.FromFile(\"XXX\")"

其中最關鍵的部分算是擷取動态代碼的值.以下為擷取動态代碼值的類,不足之處還請指正.

------------------------------------------------

1 usingMicrosoft.CSharp;
  2 usingSystem.Reflection;
  3  using System.CodeDom.Compiler;
  4 
  5 public static class CSharpCodeValueHelper<T>
  6     {
  7         /// <summary>
  8         /// 編譯器執行個體
  9         /// </summary>
 10         private static CSharpCodeProvider CSharpCodeProvider { get; set; }
 11 
 12         /// <summary>
 13         /// 編譯器參數
 14         /// </summary>
 15         private static CompilerParameters CompilerParameters { get; set; }
 16 
 17         /// <summary>
 18         /// 構造函數
 19         /// </summary>
 20         static CSharpCodeValueHelper()
 21         {
 22             CSharpCodeProvider = new CSharpCodeProvider();
 23 
 24             CompilerParameters = new CompilerParameters();
 25             CompilerParameters.ReferencedAssemblies.Add("System.dll");
 26             CompilerParameters.ReferencedAssemblies.Add("System.Data.dll");
 27             CompilerParameters.ReferencedAssemblies.Add("System.Deployment.dll");
 28             CompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");
 29             CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
 30             CompilerParameters.ReferencedAssemblies.Add("System.Xml.dll");
 31             CompilerParameters.GenerateExecutable = false;
 32             CompilerParameters.GenerateInMemory = true;
 33         }
 34 
 35         /// <summary>
 36         /// 擷取代碼的值
 37         /// </summary>
 38         /// <param name="CSharpCode">CSharpCode代碼</param>
 39         /// <returns>動态CSharpCode代碼的值</returns>
 40         public static T GetCodeValue(string CSharpCode)
 41         {
 42             CompilerResults compilerResults = CSharpCodeProvider.CompileAssemblyFromSource(CompilerParameters, CreateCode(CSharpCode));
 43 
 44             if (compilerResults.Errors.HasErrors)
 45             {
 46                 string errorString = string.Empty;
 47                 errorString += "編譯錯誤:\n";
 48                 foreach (CompilerError err in compilerResults.Errors)
 49                 {
 50                     errorString += err.ErrorText + "\n";
 51                 }
 52                 throw new Exception(errorString);
 53             }
 54             else
 55             {
 56                 // 通過反射,調用動态類DynamicClass執行個體
 57                 Assembly assembly = compilerResults.CompiledAssembly;
 58                 object dynamicClass = assembly.CreateInstance("DynamicNamespace.DynamicClass");
 59                 MethodInfo methodInfo = dynamicClass.GetType().GetMethod("GetValue");
 60 
 61                 return (T)methodInfo.Invoke(dynamicClass, null);
 62             }
 63         }
 64 
 65         /// <summary>
 66         /// 建立代碼
 67         /// </summary>
 68         /// <param name="CSharpCode">CSharpCode代碼</param>
 69         /// <returns>建立完成的代碼</returns>
 70         private static string CreateCode(string CSharpCode)
 71         {
 72             StringBuilder strBuilder = new StringBuilder();
 73             strBuilder.AppendLine("using System;");
 74             strBuilder.AppendLine("using System.Collections.Generic;");
 75             strBuilder.AppendLine("using System.ComponentModel;");
 76             strBuilder.AppendLine("using System.Data;");
 77             strBuilder.AppendLine("using System.Drawing;");
 78             strBuilder.AppendLine("using System.Text;");
 79             strBuilder.AppendLine("using System.Windows.Forms;");
 80 
 81             strBuilder.AppendLine("namespace DynamicNamespace");
 82             strBuilder.AppendLine("{");
 83             strBuilder.AppendLine("      public class DynamicClass");
 84             strBuilder.AppendLine("      {");
 85             strBuilder.AppendLine("          public object GetValue()");
 86             strBuilder.AppendLine("          {");
 87             strBuilder.AppendLine("               return " + CSharpCode + ";");
 88             strBuilder.AppendLine("          }");
 89             strBuilder.AppendLine("      }");
 90             strBuilder.AppendLine("}");
 91 
 92             string code = strBuilder.ToString();
 93             return code;
 94         }
 95     }
 96 
 97 
 98 
 99 
100     
      

下面是調用(注意調用時特殊字元的轉義)

1 Color coor = CSharpCodeValueHelper<Color>.GetCodeValue("Color.FromArgb(100,100,100)");
2 
3 
4 Image img = CSharpCodeValueHelper<Image>.GetCodeValue("Image.FromFile(\"C:\\\\tu.jpg\")");