我找到了创建运行时函数的示例。
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");
}
主要:
static void Main(string[] args)
{
MethodInfo function = CreateFunction("x + 2 * y");
object result = function.Invoke(null, new object[] { 2, 3 });
Console.WriteLine(result);
}
主要问题是如何在运行时创建属性并在Main
中向其传递值?
public static PropertyInfo CreateProperty()
{
string code=@"
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);
///
}
同样的方式?
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));
}