动态编程
最初想法:类似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
本文探讨了如何在C#中实现动态编程,通过CSharpCodeProvider和CompilerParameters进行动态编译,创建并设置属性。作者设定了一个小目标,即根据源代码动态编译并操作属性,并成功实现了这一目标。尽管遇到命名空间的问题导致无法将动态编译的类与现有类合并,但已达到初步目标。总结中提到,这只是动态编程的起点,未来还有更多可能性。
2306

被折叠的 条评论
为什么被折叠?



