为什么推荐使用.NET中的reflection?

使用它绝对是一个好习惯吗?

项目中需要反思的可能情况是什么?

Reflection的主要价值在于它可以用来检查程序集,types和成员。 这是一个非常强大的工具,用于确定未知组件或对象的内容,并可用于各种各样的情况。

反思的反对者会指出,它是缓慢的,与静态代码执行相比是真实的 – 但是在整个.NET框架中使用了reflection,并且假定它没有被滥用,它可以是工具箱中非常强大的工具。

一些有用的应用:

  • 确定程序集的依赖关系

  • 符合接口的位置types,从基类/抽象类派生,并通过属性search成员

  • (臭)testing – 如果你依赖于一个不可testing的类(也就是说不允许你轻易地构build一个假的类),你可以使用Reflection在类中注入假值 – 这不是很好,也不推荐,但它可以成为一个方便的工具。

  • debugging – 倾出加载的程序集列表,其引用,当前的方法等…

reflection有很多用途:

  1. 迭代对象中的属性。
  2. 调用在运行时定义的方法。
  3. 许多其他的在同一个脉络。

然而,我最喜欢reflection的一个用途是find已经标记了属性的属性。

例如,我写了一些属性,用于标记我的类中的哪些属性应该使用Lucene进行索引。 在运行时,我可以查看任何类,然后通过查询类的“标记”属性来找出需要索引的字段。

reflection只是在运行期间调查对象的一种方式。 如果你不需要这样做,你就不应该使用它。

reflection允许应用程序收集有关自己的信息,也可以自己操纵。 它可以用来查找程序集中的所有types和/或dynamic调用程序集中的方法。

System.Reflection:命名空间包含提供已加载types,方法和字段的托pipe视图的类和接口,并具有dynamic创build和调用types的能力; 这个过程在.NET框架中被称为Reflection。

System.Type: class是.NET Reflectionfunction的主要类,也是访问元数据的主要方式。 System.Type类是一个抽象类,代表了Common Type System(CLS)中的一个types。

它表示types声明:类types,接口types,数组types,值types,枚举types,types参数,genericstypes定义以及打开或closures构造的genericstypes。

例如:

using System; using System.Reflection; static class ReflectionTest { public static int Height; public static int Width; public static int Weight; public static string Name; public static void Write() { Type type = typeof(ReflectionTest); // Get type pointer FieldInfo[] fields = type.GetFields(); // Obtain all fields foreach (var field in fields) // Loop through fields { string name = field.Name; // Get string name object temp = field.GetValue(null); // Get value if (temp is int) // See if it is an integer. { int value = (int)temp; Console.Write(name); Console.Write(" (int) = "); Console.WriteLine(value); } else if (temp is string) // See if it is a string. { string value = temp as string; Console.Write(name); Console.Write(" (string) = "); Console.WriteLine(value); } } } } class Program { static void Main() { ReflectionTest.Height = 100; // Set value ReflectionTest.Width = 50; // Set value ReflectionTest.Weight = 300; // Set value ReflectionTest.Name = "ShekharShete"; // Set value ReflectionTest.Write(); // Invoke reflection methods } } Output Height (int) = 100 Width (int) = 50 Weight (int) = 300 Name (string) = ShekharShete 

例如,您可以使用reflection来实现一个插件系统。 你只需要查找一个文件夹中的所有DLL,并通过reflection来检查它们是否实现了某个特定的插件接口。 这是我使用reflection的主要目的,但我也用它来实现一个通用的自制对象序列化,其中性能并不是最受关注的。

如上所述,performance将受到打击。

另一个很大的优点是可以dynamic加载程序集,执行属性操作,即使你可能没有范围来看看要改变什么等等。

使用这个的原因很多。 如果您需要,这是一个介绍 。

reflection通常用在IoC容器中。 比方说,你想要注册每个具体类的结尾与单词“控制器”。 reflection使这一块蛋糕。

unit testing类时,我也使用reflection来操作私有字段。

非常有用的XmlSerialization类依赖于reflection。 您不必自己处理reflection以使用序列化,序列化类本身就会调用reflection。 但它有助于标记您的代码与指导如何对象序列化的属性。 序列化类在运行时使用reflection来读取这些属性。 最后,这个过程似乎很神奇,在应用程序中只需要很less的显式编码; 这是反映,使便利成为可能。

XmlSerialization本身非常棒,不仅因为它是从应用程序创build数据文件的一种非常方便的方式,而且也是一种非常简单的方法,用于为debugging目的而生成程序内部数据模型的人类可读logging。

来自C ++,需要一些简单的类层次结构,我可以说,关键字是无价的!

 class MenuItem : Item { } foreach(Item items in parent.ChildItems) { if (item is MenuItem) { /* handle differently */ } } 

PS是不reflection稍贵,顺便说一句?