C# 反射解决了什么问题?

C# 反射解决了什么问题?,c#,reflection,C#,Reflection,我浏览了网站上的所有帖子,但找不到我问题的答案 在.NET反射之前,编程界存在哪些问题 它是如何解决这些问题的 请举例说明。应该指出的是,.NET反射并不是革命性的-这些概念在其他框架中已经存在 .NET中的反射有两个方面: 调查类型信息 如果没有某种反射/内省API,则很难执行序列化之类的操作。您通常需要生成代码,即明确知道如何序列化每个类型的代码,而不是在运行时提供(通过检查属性/字段等)。如果你想序列化一些没有双胞胎的东西,那会很乏味,也很痛苦 同样,也没有地方存储有关属性等的附加元数据,

我浏览了网站上的所有帖子,但找不到我问题的答案

在.NET反射之前,编程界存在哪些问题 它是如何解决这些问题的


请举例说明。

应该指出的是,.NET反射并不是革命性的-这些概念在其他框架中已经存在

.NET中的反射有两个方面:

调查类型信息

如果没有某种反射/内省API,则很难执行序列化之类的操作。您通常需要生成代码,即明确知道如何序列化每个类型的代码,而不是在运行时提供(通过检查属性/字段等)。如果你想序列化一些没有双胞胎的东西,那会很乏味,也很痛苦

同样,也没有地方存储有关属性等的附加元数据,因此最终会有大量附加代码或外部配置文件。简单到能够将友好的名称与属性(通过属性)关联,这对UI代码来说是一个巨大的胜利

元编程

.NET反射还提供了一种在运行时创建类型(etc)的机制,这对于某些特定场景来说非常强大;备选方案是:

  • 实际上,在运行时运行解析器/逻辑树(而不是在运行时将逻辑编译为可执行代码)要慢得多
  • 还有更多的代码生成-耶
      我认为要理解.NET中的反射需求,我们需要回到.NET之前。毕竟,像Java和C#这样的现代语言没有历史BF(在反射之前)

      可以说,C++对C#和Java的影响最大。但是C++最初没有反射,我们没有它就编码了,我们设法通过了。有时我们会使用void指针,并使用强制转换将其强制转换为我们想要的任何类型。这里的问题是演员阵容可能会失败,造成可怕的后果:

      double CalculateSize(void* rectangle) {
          return ((Rect*)rectangle)->getWidth() * ((Rect*)rectangle)->getHeight());
      }
      
      现在有很多争论为什么你不应该把自己编码到这个问题中去。但问题与.NET 1.1在没有泛型的情况下使用C#时没有太大区别:

      Hashtable shapes = new Hashtable();
      ....
      double CalculateSize(object shape) {
          return ((Rect)shape).Width * ((Rect)shape).Height;
      }
      
      然而,当C#示例失败时,它会出现异常,而不是潜在的内核转储

      当向C++添加反射(称为运行时类型标识或RTTI)时,它被激烈地讨论。在Stroustrup的《C++设计与进化》一书中,他列举了以下内容 反对RTTI的论点,因为有些人:

      但它确实允许我们查询对象的类型或对象的特征。例如(使用C#)

      当然,有了正确的计划,这个例子应该永远不会发生

      因此,我需要它的现实情况包括:

      • 从共享内存访问对象,我只有一个指针,我需要决定如何使用它
      • 动态加载程序集,考虑NUnit在其中加载每个程序集,并使用反射来确定哪些类是测试夹具
      • 在哈希表中有一个混合的对象包,并希望在枚举器中以不同的方式处理它们
      • 许多其他人
      因此,我甚至认为,反思并没有使我们能够做以前做不到的事情。然而,它确实使某些类型的问题更容易编码,读者更清楚,编写时间更短,等等


      当然这只是我的观点,我可能错了

      我曾经希望将单元测试放在一个文本文件中,非技术用户可以用C++的格式修改它:

      MyObj Function args //textfile.txt
      
      <>但是我找不到一个字符串读取方法,然后代码创建一个由字符串表示的对象实例,而没有C++不支持的反射。
      char *str; //read in some type from a text file say the string is "MyObj"
      str *obj;  //cast a pointer as type MyObj  
      obj = new str;  //create a MyObj
      

      另一个用途可能是拥有一个泛型复制函数,该函数可以复制类的成员,而无需事先知道它们

      当您在代码中使用C#属性(如[Observe]或[Serializable])时,它会有很大帮助。像这样的框架使用类反射和包含方法来理解哪些方法是测试、设置、拆卸等。

      @Praveen-这是一个相当广泛的问题。你能说得更具体一点吗?目前不是一个真正的问题:不可能回答。也许,如果你扩展了你试图确定的东西。这个问题是否等同于“反射解决了什么问题?”。。。是的,这听起来很像家庭作业/考试类型的问题。完全合法的问题。为什么我们需要一些东西,与它做什么和如何做一样重要,与编程同样重要。“反射会产生什么问题?”回答这个问题,获得额外分数。
      MyObj Function args //textfile.txt
      
      char *str; //read in some type from a text file say the string is "MyObj"
      str *obj;  //cast a pointer as type MyObj  
      obj = new str;  //create a MyObj