Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时创建C#类_C#_.net - Fatal编程技术网

在运行时创建C#类

在运行时创建C#类,c#,.net,C#,.net,我一直对C#中运行时动态创建类很感兴趣,偶然发现了这篇文章。我很想听到一些关于在运行时构造类的利弊 有什么意见吗?您可能已经有了运行时生成类的经验。泛型是在CLR的运行时构建的,当它们第一次被需要时。XmlSerializer的实现也是如此 在运行时从头开始构建类可能非常难看(除非您喜欢查看大量反射和Dom代码)。这是一种罕见的情况,因为它是最清晰、最简单的解决方案。优点:您可以在运行时创建所需的任何内容 缺点:您没有编译时检查,所以如果出现任何错误,一切都会崩溃 基本上与使用反射的优点/缺点相

我一直对C#中运行时动态创建类很感兴趣,偶然发现了这篇文章。我很想听到一些关于在运行时构造类的利弊


有什么意见吗?

您可能已经有了运行时生成类的经验。泛型是在CLR的运行时构建的,当它们第一次被需要时。XmlSerializer的实现也是如此


在运行时从头开始构建类可能非常难看(除非您喜欢查看大量反射和Dom代码)。这是一种罕见的情况,因为它是最清晰、最简单的解决方案。

优点:您可以在运行时创建所需的任何内容

缺点:您没有编译时检查,所以如果出现任何错误,一切都会崩溃


基本上与使用反射的优点/缺点相同。

这不是优点和缺点的问题

有时,基于以另一种方式转换为代码非常繁琐的信息或在运行时之前不可用的信息创建类是很方便的


链接文章中的示例不是您(作为应用程序程序员)通常会做的事情。但它在工具中很有用,例如,基于数据库或XML模式生成类

每件事都有时间和地点,包括这个(例如,泛型)。不过,我会考虑在运行前生成类的方法,然后再去做。除了生成类,很可能还有一种更好、更容易维护的替代方法。

一个让人想到的缺点是内存使用。如果每次收到请求时都动态构建一个类来处理某个请求,那么每次都有可能为相同的值生成一个新类。一旦类或程序集加载到应用程序域中,就无法卸载它。因此,尽可能缓存生成的程序集和类。

元编程具有生成时代码的所有优点,但不需要额外的代码步骤。这在库代码中非常常见,如ORMs、序列化程序、某些类型的AOP、DI/IoC容器等

  • +避免了额外构建步骤或编写普通代码的需要
  • +这样的代码可以处理运行时的实际情况,而不必处理任何不常见的边缘情况或包装周围的大量包装(装饰模式)
  • +在元数据仅在运行时已知的情况下允许codegen
  • +由于
    DynamicMethod
    可以与类型关联,运行时IL可以更多地访问私有字段等;完全生成的(dll)代码需要
    [InternalsVisibleTo]
    或类似代码,这可能是不可能的
  • -并非所有系统都支持运行时代码生成;它在某些服务器设置、compact framework、iPhone等上被禁用
  • -做这件事很难看。无论您如何操作,这都不是正常代码
  • -它需要很好地理解事情在幕后是如何运作的
  • +如果你强迫你很好地理解事情在幕后是如何运作的

我目前正在重新编写一个现有库,以使用运行时IL生成;这是非常有益的,我很高兴;但这与我以前写的任何东西都不一样。

除了这个问题吗?您能否将在运行时使用反射创建的代码保存到程序集。这样您就不必再次创建它了?是的,实际上您提供的链接已经保存了生成的code.lol。有趣的是,这是代码的最后一部分。显示了我有多注意。很抱歉,谢谢大家的意见。