是不是一定要使用它一个很好的做法?
什么是需要反思的项目的一些可能发生的情况?
是不是一定要使用它一个很好的做法?
什么是需要反思的项目的一些可能发生的情况?
反射的主要价值在于,它可用于检查组件,类型和成员。 这是用于确定未知的组件或对象的内容,并且可以在多种情况下可以使用一个非常强大的工具。
反思的对手将举,它是缓慢的,相对于静态代码执行哪个是真的 - 但是反映在整个.NET框架中使用,并且只要它不被滥用它可以在工具箱一个非常强大的工具。
一些有用的应用程序:
确定的组件的依赖关系
这符合一个接口位置类型,从基/抽象类派生,并且通过属性搜索部件
(臭臭)测试 - 如果你依赖于一个类,这是不可测的(即它不允许你轻松建立一个假的),你可以使用反射类中注入假的价值 - 它不漂亮,不推荐,但它可以在绑定一个方便的工具。
调试 - 倾出装组件,它们的引用,当前的方法等的列表...
有反思很多用途:
然而,我最喜欢反思的用途之一是找到那些被打上属性的属性。
例如,我写的标志,它在我的类的属性应使用Lucene索引属性。 在运行时,我可以看看任何类,并找出领域需要什么的话,被刚刚查询“标记”属性的类建立索引。
反思只是在运行过程中调查对象的方法。 如果你不需要做到这一点,则不应使用它。
反射允许应用程序收集关于自身的信息,也对自己操纵。 它可以被用于发现的所有类型在装配和/或动态地调用在装配的方法。
的System.Reflection:命名空间包含提供加载类型,方法和字段的管理图,其中动态地创建和调用类型的能力的类和接口; 这个过程被称为在.NET框架思考。
System.Type的:类是NET反射功能的主要类,并且是访问元数据的主要方式。 的System.Type类是一个抽象类,并且表示在通用类型系统(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
您可以使用反射来实现插件示例的系统。 你只要寻找所有的DLL的文件夹中,并通过反映检查,如果他们实现一定的插件接口。 这是我用反射的主要目的,但我还用它来实现一个通用的家庭酿造对象序列化,在性能不是最关心的问题。
正如上面提到的,性能将会受到冲击。
另一大好处是,你可以动态加载组件,执行属性操作,即使你可能没有范围,看看有什么变化,等等。
原因使用这个很多。 这是一个介绍 ,如果您需要。
反射在IoC容器常用。 比方说,你要端注册每一个具体类单词“控制器”。 反射使得这一块蛋糕。
我还用反射机制来操作时,单元测试类的私有字段。
非常有用XmlSerialization类依赖反射。 你不必应付反射自己使用序列化,序列化类调用反思自己。 但它有助于指导对象是如何序列化属性标记您的代码。 序列化类使用反射在运行时读取这些属性。 最终,过程似乎是不可思议的,需要在应用程序明确编码很少线; 它的反射,使该便利成为可能。
XmlSerialization本身是真棒,不仅因为它是从应用程序中创建数据文件非常方便的方式,这也是产生程序的内部数据模型的人类可读记录用于调试目的的一个非常简单的方法。
从C ++来了,已经需要一些简单的类层次结构,我可以说is
关键字是无价的!
class MenuItem : Item { }
foreach(Item items in parent.ChildItems) {
if (item is MenuItem) { /* handle differently */ }
}
PS是不是反射稍贵,顺便说一句?