C# · 12月 31, 2021

C#中反思的理由

我想知道C#代码中反思的适当性.例如,我编写了一个函数,它遍历给定源对象的属性,并创建一个指定类型的新实例,然后将具有相同名称的属性值从一个复制到另一个.我创建了这个,以将数据从一个自动生成的LINQ对象复制到另一个,以避免LINQ中的多个表缺少继承.

不过,我不禁想到这样的代码真的是“欺骗”,而不是使用提供的语言结构来实现给定的结束,它允许你规避它们.

这种代码在多大程度上是可以接受的?有什么风险?这种方法的合法用途是什么?

解决方法 有时使用反射可能是一个黑客,但很多时候它只是最美妙的代码工具.

看看.Net属性网格 – 任何使用Visual Studio的人都会熟悉它.您可以将其指向任何对象,它将生成一个简单的属性编辑器.这使用反射,事实上VS的大部分工具箱都是.

看单元测试 – 它们通过反射加载(至少在NUnit和MSTest中).

反射允许来自静态语言的动态样式行为.

一个真正需要的是鸭子打字–C#编译器已经支持这一点:你可以先看看任何看起来像IEnumerable的东西,不管它是否实现了接口.您可以对任何具有名为Add的方法的类使用C#3集合语法.

在需要动态样式行为的地方使用反射 – 例如,您有一组对象,并且要检查每个对象的相同属性.

动态类型的风险是相似的 – 编译时间异常成为运行时间.你的代码不是“安全”,你必须做出相应的反应.

.Net反射代码非常快,但不如显式调用那么快.