我看到很多在c#中使用反射的例子,但我不确定它在c#中主要用于什么。所以你什么时候使用它?
答案 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在这个问题上的回答非常好:
答案 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应用程序页面(来自完全独立的页面)中的控件列表。
它可用于动态实例化类,分析程序集,键入检查......
它说的是反思,它允许程序看自己。