什么是反射,它可以在c#中使用什么?

时间:2010-06-04 02:07:35

标签: c# reflection system.reflection

  

可能重复:
  Reflection. What can we achieve using it?

我看到很多在c#中使用反射的例子,但我不确定它在c#中主要用于什么。所以你什么时候使用它?

8 个答案:

答案 0 :(得分:2)

真实案例:

一个函数,当传递名称空间的名称时,会查看名称空间中的所有类,如果它在类中找到函数“SelfTest”,则调用它,如果需要,则实例化一个对象。

这允许我将测试函数声明为对象的一部分,而不必担心维护测试列表。

答案 1 :(得分:1)

有很多方法可以使用它。我使用它的一种方法是在单元测试时,我需要破坏一些私有变量以使单元测试失败(模拟故障测试场景)。例如,如果我想模拟数据库连接失败,那么我可以使用下面的方法来更改与DB一起使用的类中的connectionString私有变量。当我尝试连接到数据库时,这会导致数据库连接失败,在我的单元测试中,我可以验证是否抛出了正确的异常。

例如:

/// <summary>
/// Uses reflection to set the field value in an object.
/// </summary>
///
/// <param name="type">The instance type.</param>
/// <param name="instance">The instance object.</param>
/// <param name="fieldName">The field's name which is to be fetched.</param>
/// <param name="fieldValue">The value to use when setting the field.</param>
internal static void SetInstanceField(Type type, object instance, string fieldName, object fieldValue)
{
    BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
        | BindingFlags.Static;
    FieldInfo field = type.GetField(fieldName, bindFlags);
    field.SetValue(instance, fieldValue);
}

答案 2 :(得分:1)

Relection是一种允许开发人员在运行时访问类型/实例的元数据的技术。
最常见的用法是定义 CustomAttribute 并在运行时使用它。 CustomAttribute已用于ORM,ASP.Net ActionFilter,单元测试框架等。

Cory Charlton在这个问题上的回答非常好:

Reflection. What can we achieve using it?

答案 3 :(得分:1)

一般来说,触及System.Type类型的任何内容都可视为反射。对于各种Convention over Configuration场景,它通常很有用(除其他外)。

考虑一个示例,您希望在运行时之前创建一个您不知道的类型的实例:

public interface IVegetable {
   public float PricePerKilo {get;set;}
}

public class Potato : IVegetable {
   public float PricePerKilo {get;set;}
}

public class Tomato : IVegetable {
   public float PricePerKilo {get;set;}
}

public static class Program {
  public static void Main() {
    //All we get here is a string representing the class
    string className = "Tomato";
    Type type = this.GetType().Assembly.GetType(className); //reflection method to get a type that's called "Tomato"
    IVegetable veg = (IVegetable)Activator.CreateInstance(type);
  }
}

答案 4 :(得分:0)

答案 5 :(得分:0)

了解Microsoft如何在 web.config 中使用它,例如:)

当我必须从Autocompletebox过滤项目(使用ItemFilter属性)时,我使用它。 ItemSource是用Linq设置的。由于每个项目都是AnonymousType,我使用Reflection来获取属性并执行我想要的过滤器。

答案 6 :(得分:0)

我将它用于验证/编码,比如查看类中的所有字符串并在发送到Web视图之前将它们更改为HTML安全字符串。类似的当从视图中检索数据时,我通过编码/正则表达式运行,以确保只使用安全的html字符。

另一种方法是在C#中编写插件,希望在运行时知道这些功能。来自代码项目的示例:http://www.codeproject.com/KB/cs/pluginsincsharp.aspx

答案 7 :(得分:0)

我用它来编译Web应用程序页面(来自完全独立的页面)中的控件列表。

它可用于动态实例化类,分析程序集,键入检查......

它说的是反思,它允许程序看自己。