动态编程
最初想法:类似js那样动态的加载一段源代码可以直接对其操作。
js属于解释型语言,所以动态对于他来说属于先天具有,可以说是固有属性。
c# 属于编译型语言,所有对象理论都应该是提前编译好,才能运行的。
但是.net 已经考虑好了这一点,所以从根本上是支持动态编程的。
第一个小目标
根据源代码,动态编译并且能够设置和取到对应的属性值
知识点
- 反射 (基本使用到的两个类 Activator或者 Assembly。 有兴趣的网上搜资料)
- 动态编译 (CSharpCodeProvider,CompilerParameters)
源代码
namespace 动态编程
{
//提前定义的一个类型,最初的目的是给这个类型动态增加属性,现在没实现,但是先记录在这里,埋个坑。
public partial class Person
{
public string Name { get; set; }
}
}
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Reflection;
namespace 动态编程
{
class Program
{
static void Main(string[] args)
{
Person p = new Person() { Name = "aaaaaa" };
//创建编译器实例。
CSharpCodeProvider provider = new CSharpCodeProvider();
//设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
//创建动态代码。
string source = @"
public partial class Person
{
public int Age { get; set; }
}
";
CompilerResults result = provider.CompileAssemblyFromSource(paras, source);
//获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
object obclass = assembly.CreateInstance("Person");
obclass.GetType().GetProperty("Name")?.SetValue(obclass, "LLLLL", null);
obclass.GetType().GetProperty("Age")?.SetValue(obclass, 11, null);
Console.WriteLine(p.Name);
Console.WriteLine(obclass.GetType().GetProperty("Name")?.GetValue(obclass, null));
Console.WriteLine(obclass.GetType().GetProperty("Age")?.GetValue(obclass, null));
Console.ReadLine();
}
}
}
显示结果
待处理坑1
本来想着都对应成partial的类,编译的时候可以生成同一个类型。
但是不行,因为动态编译的那个我加上命名空间就报错。
总结
虽然留下了一些坑,但是第一个小目标已经实现。
这只是开始,不是终止… 尽情期待!
https://www.cnblogs.com/flycloudliestar/p/5872170.html