[小技巧]C# .net 动态编程 (1)

动态编程

最初想法:类似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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值