如果通用数学代码存储为一个字符串,可以使用 string hacking(又名macros aka string replace),以改变运行时的代码。我们可以写一个函数,然后在使用该函数时改变该函数的类型。因此,我们可以认定泛型有必须的数学操作符来实现该函数。
在第一次调用函泛时,它会构建自己和重新自动分配。这样,我们就不必处理一个愚蠢的构造函数,它只须要根据我们所需构造泛函即可。
据我所知,你不能编译使用运行时编译器编译单个对象,我只是编译了一个返回我需要的值类型的方法。可能存在替代方法,尤其是当你使用序列化技术的时候,但是我不是很熟悉学历恶化格式,所以这种方法对我来说可能更容易。
优点:
每一种类型只需要代码的一个版本。
有没有构造方法或设置方法调用,方法会像我们所希望的那样自我构造。
快!这种方法据我所知唯一的开销调用委托的开销。
小缺点:(这些“缺点”可以克服)
1.它可以是恼人的编写通用的数学函数作为一个字符串。 解决办法:我建议在单独的文件编写通用代码并解析。这样的字符串不是永久被保存在内存,你仍然可以编辑它,就像在 Visual Studio 中使用标准的C#一样。
2.这不是一个跨平台的例子。补丁:它很容易实现跨平台功能。根据他们的网站所述,这像一个包含反射和运行时编译库的 Mono 项目。因此只要动态查找运行时编译器就能让“生成的”功能类跨平台。
3.如果泛型的“typeof(T).ToString()”被嵌入到泛型中,现在的这些代码将会崩溃。补丁:使用某种类型创建一个函数 再创建一个适当的字符串来表示这种类型达到和原始代码一样的目的。
4.我们还是有编译错误。告诉我们有自定义类型”struct Fraction128“忘记重载”+“运算符。同时也会抛出运行时错误。补丁:这个问题可以通过在编译时写一个 VS 插件去检测泛函运算中使用的类型是否包含基本数值操作符而被修复。我只是把这些问题指出来告诉你们它是可修复的,我不会去做这些。到用的时候,不要干蠢事,:P
结论通过使用运行时编译,您可以将存在数学运算符和值类型转换的假设强制认定为成立,使你能够做一些真正意义生的数学计算。它是快速的,相对于本文中介绍的其他方法是易于维护的,而且非常强大。
虽然这不是全部...我心中已经有了一些改进的想法。如果您有任何建议,我很愿意虚心聆听。谢谢!
本文及相关源代码及文件属于 The Code Project Open License (CPOL)
源代码本地下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/5月/30日/C# 中利用运行时编译实现泛函/
------------------------------------------分割线------------------------------------------