动态编程
最初想法:类似js那样动态的加载一段源代码可以直接对其操作。
js属于解释型语言,所以动态对于他来说属于先天具有,可以说是固有属性。
c# 属于编译型语言,所有对象理论都应该是提前编译好,才能运行的。
但是.net 已经考虑好了这一点,所以从根本上是支持动态编程的。
第一个小目标
知识点
- 反射 (基本使用到的两个类 Activator或者 Assembly。 有兴趣的网上搜资料)
- 动态编译 (CSharpCodeProvider,CompilerParameters)
源代码
```csharp using Microsoft.CSharp; using System; using System.CodeDom.Compiler; using System.Reflection;namespace 动态编程
{
//提前定义的一个类型,最初的目的是给这个类型动态增加属性,现在没实现,但是先记录在这里,埋个坑。
public partial class Person
{
public string Name { get; set; }
}
}
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
————————————————
版权声明:本文为CSDN博主「iml6yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iml6yu/article/details/119858045