STW*_*STW 36
Reflection的主要价值在于它可用于检查程序集,类型和成员.它是一个非常强大的工具,用于确定未知装配或对象的内容,并可用于各种情况.
反射的反对者会引用它很慢,这与静态代码执行相比是正确的 - 但是反射在整个.NET框架中使用,并且只要它没有被滥用,它就可以成为工具包中非常强大的工具.
一些有用的应用:
确定程序集的依赖关系
符合接口的位置类型,派生自基础/抽象类,并按属性搜索成员
(臭臭)测试 - 如果你依赖一个不可测试的类(即它不允许你轻易地构建一个假的)你可以使用Reflection在类中注入假值 - 它不漂亮,不推荐,但它可以成为绑定中的一个方便工具.
调试 - 转出已加载的程序集,它们的引用,当前方法等的列表......
Est*_*aya 31
反射有很多用途:
但是,我最喜欢使用的反射之一是查找已使用属性标记的属性.
例如,我编写了一些属性,用于标记我的类中的哪些属性应该使用Lucene编制索引.在运行时,我可以查看任何类,并通过仅查询"标记"属性的类来确定需要索引哪些字段.
SHE*_*ETE 13
反射允许应用程序收集有关自身的信息,也可以自行操作.它可用于查找程序集中的所有类型和/或动态调用程序集中的方法.
System.Reflection: namespace包含提供已加载类型,方法和字段的托管视图的类和接口,能够动态创建和调用类型; 这个过程在.NET框架中称为Reflection.
System.Type: class是.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
Run Code Online (Sandbox Code Playgroud)
例如,您可以使用反射来实现插件系统.您只需在文件夹中查找所有DLL,并通过反射检查它们是否实现了某个插件接口.这是我使用反射的主要目的,但我也用它来实现通用的home-brew对象序列化,其中性能不是最大的问题.
归档时间: |
|
查看次数: |
67244 次 |
最近记录: |