是否可以使用 .NET 中的反射向类添加函数?
例如,我是否可以编写代码,将函数添加到添加两个 Int32 并返回结果的类中?
这是假设没有任何这样的函数已经编译到系统中,所以我想到的基本上是将字符串转换为函数,类似于 JavaScript 对“eval”所做的事情(是的,我知道那eval
是邪恶的)。
是否可以使用 .NET 中的反射向类添加函数?
例如,我是否可以编写代码,将函数添加到添加两个 Int32 并返回结果的类中?
这是假设没有任何这样的函数已经编译到系统中,所以我想到的基本上是将字符串转换为函数,类似于 JavaScript 对“eval”所做的事情(是的,我知道那eval
是邪恶的)。
您应该能够使用以下几种方法在运行时创建程序集:
使用Roslyn(目前在 CTP 中),您应该能够将任意一段 .NET 代码编译成程序集,并且它可以轻松工作。这是目前进行运行时代码生成最轻松的方式。
您可以通过 ILWeaving 以硬(更)的方式做到这一点。这基本上是在运行时发出 IL 代码,您不仅可以生成新的类/函数等。但您可以修改现有的。一些已经通过ILWeaving实现的 INotifyPropertyChanged 接口。你仍然需要对IL有很好的理解才能做到这一点。
使用某种Aspect 框架。这些框架为您完成了繁重的工作,因此您无需编写 IL 代码。通常在编译时会为您生成必要的代码。
使用动态代理,您还可以对现有代码的操作进行一些控制,例如,如果您有兴趣在类的现有方法/函数之前/之后做某事。
您还必须发出该类,所以不,您不能添加,这也很痛苦。
看看使用.NET动态语言Python、Ruby甚至 java(以及 ECMA)脚本都可用。
根据您对 Mitch 的回答的评论,您可能想要查看的另一件事是AppDomain.AssemblyResolve事件。您可以做一些有趣的事情,例如将程序集保存在数据库 blob 中。
不过,您需要提前对该路线进行一些认真的计划。
不,不是。您只能从类中的函数中读取,不能添加。无论如何,你为什么需要?只需在当前程序中编写要添加到其中的代码即可。