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

Jas*_*wal 56 .net c# reflection

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

需要反思的项目中有哪些可能的情况?

STW*_*STW 36

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

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

一些有用的应用:

  • 确定程序集的依赖关系

  • 符合接口的位置类型,派生自基础/抽象类,并按属性搜索成员

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

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

  • 几乎所有的测试框架都使用反射来开始,找到并执行测试...... (24认同)

Est*_*aya 31

反射有很多用途:

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

但是,我最喜欢使用的反射之一是查找已使用属性标记的属性.

例如,我编写了一些属性,用于标记我的类中的哪些属性应该使用Lucene编制索引.在运行时,我可以查看任何类,并通过仅查询"标记"属性的类来确定需要索引哪些字段.


Sam*_*ham 25

反射只是在运行时调查对象的一种方式.如果您不需要这样做,就不应该使用它.

  • 的确。反射是一种极其强大的资源,但它承担着性能责任,因此除非确实必要,否则不应使用它。 (2认同)

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)


rsl*_*ite 8

例如,您可以使用反射来实现插件系统.您只需在文件夹中查找所有DLL,并通过反射检查它们是否实现了某个插件接口.这是我使用反射的主要目的,但我也用它来实现通用的home-brew对象序列化,其中性能不是最大的问题.


Kyl*_*ndo 6

如上所述,性能将受到打击.

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

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


Sco*_*Muc 6

反射通常用在IoC容器中.假设您想要在每个具体类中注册"Controller"一词.反思使这成为一块蛋糕.

在单元测试类时,我还使用反射来操作私有字段.