2016-06-03 1 views
2

J'ai trouvé un exemple avec la création de la fonction d'exécution.Créer une propriété en exécution et passer la valeur

public static MethodInfo CreateFunction(string function) 
    { 
     string code = @" 
     using System; 

     namespace UserFunctions 
     {     
      public class BinaryFunction 
      {     
       public static double Function(double x, double y) 
       { 
        return func_xy; 
       } 
      } 
     } 
      "; 

     string finalCode = code.Replace("func_xy", function); 

     CSharpCodeProvider provider = new CSharpCodeProvider(); 
     CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), finalCode); 

     Type binaryFunction = results.CompiledAssembly.GetType("UserFunctions.BinaryFunction"); 
     return binaryFunction.GetMethod("Function"); 
    } 

principal:

static void Main(string[] args) 
{ 
    MethodInfo function = CreateFunction("x + 2 * y"); 
    object result = function.Invoke(null, new object[] { 2, 3 }); 
    Console.WriteLine(result); 
} 

La principale question est de savoir comment créer des biens dans l'exécution et passer la valeur à en Main?

public static PropertyInfo CreateProperty() 
    { 
     string [email protected]" 
     private string name; 

     public string Name { 
      get{ 
       return this.name; 
      } 
      set{ 
       this.name=value; 
      } 
     } 
     "; 
     CSharpCodeProvider provider = new CSharpCodeProvider(); 
     CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(),code); 
    /// 
    } 

Répondre

1

De la même façon?

public static Type CreateProperty(string value) 
{ 
    string code = @" 
    namespace UserFunctions 
    {     
      public class MyProperty 
      {   
      private string name = my_value 

      public string Name { 
       get{ 
        return this.name; 
       } 
       set{ 
        this.name=value; 
       } 
      } 
     } 
    } 
"; 
    code = code.Replace("my_value", '"' + value + '"'); 
    CSharpCodeProvider provider = new CSharpCodeProvider(); 
    CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), code); 
    Type myProperty = results.CompiledAssembly.GetType("UserFunctions.MyProperty"); 
    return myProperty; 
} 

static void Main() 
{ 

    Type propertyType = CreateProperty("this is a value"); 
    var property = propertyType.GetProperty("Name"); 
    var instance = Activator.CreateInstance(propertyType); 

    Console.WriteLine(property.GetValue(instance, null)); 

    property.SetValue(instance, "MyNewValue", null);    
    Console.WriteLine(property.GetValue(instance, null)); 
}