动态编程

最初想法:类似js那样动态的加载一段源代码可以直接对其操作。
js属于解释型语言,所以动态对于他来说属于先天具有,可以说是固有属性。
c# 属于编译型语言,所有对象理论都应该是提前编译好,才能运行的。
但是.net 已经考虑好了这一点,所以从根本上是支持动态编程的。

第一个小目标

根据源代码,动态编译并且能够设置和取到对应的属性值

知识点

  • 反射 (基本使用到的两个类 Activator或者 Assembly。 有兴趣的网上搜资料)
  • 动态编译 (CSharpCodeProvider,CompilerParameters)

    源代码

    1. namespace 动态编程
    2. {
    3. //提前定义的一个类型,最初的目的是给这个类型动态增加属性,现在没实现,但是先记录在这里,埋个坑。
    4. public partial class Person
    5. {
    6. public string Name { get; set; }
    7. }
    8. }
    ```csharp 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(); } } }

```

显示结果

image.png

待处理坑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