为什么建议在.NET中使用反射?

时间:2009-09-22 05:30:41

标签: c# .net reflection

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

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

9 个答案:

答案 0 :(得分:35)

Reflection的主要价值在于它可用于检查程序集,类型和成员。它是用于确定未知装配或对象内容的非常强大的工具,可用于各种情况。

反射的反对者会引用它很慢,与静态代码执行相比这是真的 - 但是反射在整个.NET框架中使用,并且只要它没有被滥用,它就可以成为工具包中非常强大的工具

一些有用的应用程序:

  • 确定程序集的依赖关系

  • 符合界面,派生自基础/抽象类,以及按属性搜索成员的位置类型

  • (臭臭)测试 - 如果你依赖一个不可测试的类(即它不允许你轻易地构建一个假的)你可以使用Reflection在类中注入假值 - 它不漂亮,不推荐,但它可以是绑定中的一个方便的工具。

  • 调试 - 转储已加载的程序集,其引用,当前方法等的列表...

答案 1 :(得分:31)

反射有很多用途:

  1. 迭代对象中的属性。
  2. 调用在运行时定义的方法。
  3. 许多其他同样的情况。
  4. 但是,我最喜欢使用反射之一是找到已用属性标记的属性。

    例如,我编写了一些属性,用于标记我的类中的哪些属性应该使用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)

如上所述,表现会受到打击。

另一个很大的优点是你可以动态加载程序集,执行属性操作,即使你可能没有范围来查看要更改的内容等。

使用它的原因很多。如果需要,这是an introduction

答案 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。是不是反映略贵,顺便说一下?