使用它绝对是一种好习惯吗?
项目中需要反思的一些可能情况是什么?
答案 0 :(得分:35)
Reflection的主要价值在于它可用于检查程序集,类型和成员。它是用于确定未知装配或对象内容的非常强大的工具,可用于各种情况。
反射的反对者会引用它很慢,与静态代码执行相比这是真的 - 但是反射在整个.NET框架中使用,并且只要它没有被滥用,它就可以成为工具包中非常强大的工具
一些有用的应用程序:
确定程序集的依赖关系
符合界面,派生自基础/抽象类,以及按属性搜索成员的位置类型
(臭臭)测试 - 如果你依赖一个不可测试的类(即它不允许你轻易地构建一个假的)你可以使用Reflection在类中注入假值 - 它不漂亮,不推荐,但它可以是绑定中的一个方便的工具。
调试 - 转储已加载的程序集,其引用,当前方法等的列表...
答案 1 :(得分:31)
反射有很多用途:
但是,我最喜欢使用反射之一是找到已用属性标记的属性。
例如,我编写了一些属性,用于标记我的类中的哪些属性应该使用Lucene编制索引。在运行时,我可以查看任何类,并通过仅查询“标记”属性的类来确定需要索引的字段。
答案 2 :(得分:24)
反射只是一种在运行时调查对象的方法。如果你不需要这样做,就不应该使用它。
答案 3 :(得分:13)
反射允许应用程序收集有关自身的信息并自行处理。它可用于查找程序集中的所有类型和/或动态调用程序集中的方法。
System.Reflection:命名空间包含提供已加载类型,方法和字段的托管视图的类和接口,能够动态创建和调用类型;这个过程在.NET框架中被称为Reflection。
System.Type:类是.NET Reflection功能的主类,是访问元数据的主要方法。 System.Type类是一个抽象类,表示Common Type System(CLS)中的类型。
它表示类型声明:类类型,接口类型,数组类型,值类型,枚举类型,类型参数,泛型类型定义以及打开或关闭构造的泛型类型。
例如:
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
答案 4 :(得分:8)
例如,您可以使用反射来实现插件系统。您只需在文件夹中查找所有DLL,并通过反射检查它们是否实现了某个插件接口。这是我使用反射的主要目的,但我也用它来实现一个通用的home-brew对象序列化,其中性能不是最大的问题。
答案 5 :(得分:6)
答案 6 :(得分:6)
反射通常用于IoC容器中。假设您想要在每个具体类中注册“Controller”一词。反思使这成为一块蛋糕。
我还在单元测试类时使用反射来操作私有字段。
答案 7 :(得分:2)
非常有用的XmlSerialization类依赖于反射。您不必自己处理反射以使用序列化,序列化类本身会调用反射。但它有助于使用属性来标记代码,这些属性指导对象的序列化方式。序列化类在运行时使用反射来读取这些属性。最后,这个过程看起来几乎是神奇的,在应用程序中只需要很少的显式编码行;这种反思使这种便利成为可能。
XmlSerialization本身很棒,不仅因为它是从应用程序创建数据文件的一种非常方便的方法,它还是一种非常简单的方法,用于生成程序内部数据模型的人类可读记录以进行调试。
答案 8 :(得分:0)
来自C ++并且需要一些简单的类层次结构,我可以说is
关键字非常宝贵!
class MenuItem : Item { }
foreach(Item items in parent.ChildItems) {
if (item is MenuItem) { /* handle differently */ }
}
P.S。是不是反映略贵,顺便说一下?