C# 动态编译并动态传入对象

创建对象并执行方法,传入一个动态对象作为参数

static object DynamicCreateAssembly(dynamic inputObject)
{
Microsoft.CSharp.CSharpCodeProvider cSharpCodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
//
System.CodeDom.Compiler.CompilerParameters compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
compilerParameters.ReferencedAssemblies.Add("System.dll");
compilerParameters.ReferencedAssemblies.Add("System.Linq.Expressions.dll");
compilerParameters.ReferencedAssemblies.Add("System.Core.dll");
compilerParameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
compilerParameters.GenerateInMemory = true;
//
string source = @"
using System;
using System.Runtime.CompilerServices;
public class Fuck {
public static string FuckMe(dynamic input)
{
Console.WriteLine(input.Age);
Console.WriteLine(input.Name);
return ""okkkk"";
}
}
";
var compilerResults = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameters, source);
if (compilerResults.Errors.Count > 0)
{
foreach (var err in compilerResults.Errors)
{
Console.WriteLine(err);
}
}
var asm = compilerResults.CompiledAssembly.CreateInstance("Fuck");
MethodInfo method = asm.GetType().GetMethod("FuckMe");
return method.Invoke(asm, new object[] { inputObject });
}

需要传入的对象

public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}

调用

static void Main(string[] args)
{
Person person = new Person();
person.Name = "撒飞洒发撒";
object result = DynamicCreateAssembly(person);
Console.WriteLine($"返回值:{result}");
Console.Read();
}

问题

经过一段时间的使用,使用dynamic作为类型传递的好处就是可以规避类型转换(同一个类型,名字一样,成员一样,在编译内外是2个不同的东西)
但dynamic却有一些无法接受的东西:

  • 无法使用编辑器的自动提示功能,意味着你写代码必须小心翼翼
  • 所以现在面临的问题是:2个对象,他们名字一样,成员一样,却不能互相转换
  • 准备尝试一下序列化,但是binary的处理方式还是不太好跨越不同空间的问题

在尝试了各种序列化之后,这不是个好方法

新的方案

由主程序提供核心类,模板类引用主程序,进行继承
模板类重写子类方法进行动态脚本的传递
模板类动态编译生成后转化为子类进行数据共享,这样可以避免数据转换
同时可以使用c#新的语法,CSharpCodeProvider 据说用的是c# 3.5的语法,没有模板字符串,没有属性初始化赋值。

posted @   trykle  阅读(576)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示