.NET Refection机制是从RTTI+COM机制演化过来的,原RTTI机制内所包含的二进制
元元素信息(元素据)异常少 一般原RTTI技术通常用于类层次间的上行与下行安全转换
与类型的一个比较在实际中应用中较少,不过由于在2000年微软推出.NET技术同时
推出了一种新的二进制元元素信息,它更安全更高效在信息采样上更加强大,不过由
此.NET Refection也带了一个问题,性能上的丢失与资源的大量占据,元元素信息以
字节存在程序中DB块,你可以在PE Explorer反汇编中看到这些量化数据。
.NET Refection机制在C#中应用是异常的广泛,你可以获取所有关于一个类的信息或
测试一个对象的类型 string.Empty is string 相信有些小伙伴想探讨在C++/CLR中我们
如何比较呢,其实办法与RTTI是相等,及 String::Empty::GetType() == String::typeid;
首先我们需要清楚我们为什么使用反射,它可以帮我们减少那些操作,举个小例子。
object obj = new { Name = "张三" };
Type t = obj.GetType();
object name = t.GetProperty("Name").GetValue(obj, null);
有的同学喜欢使用匿名类型 但是如果创建的匿名表达式,后被装箱在object中
怎么提取它的值呢,既然是匿名类型肯定不会让我们可以按照常规的办法想取值就取
值那么我们这个时候就需要涉及到反射。
var obj = new { Name = "张三" }; Type t = obj.GetType(); foreach (FieldInfo f in t.GetFields()) { if (f.GetValue(obj).Equals(obj.Name)) f.SetValue(obj, "李四"); } string name = obj.Name;我们知道匿名表达式创建的类型是隐藏的,而它给予的属于是只读,意味着我们只可
在第一次创建时进行赋值,如果我们需要赋值,那么我们肯定需要绕过编译器的语言
检查有什么好的办法吗,反射。
static void Main(string[] args) { Assembly assmbly = Assembly.LoadWithPartialName("System.Windows.Forms"); object newform = Activator.CreateInstance(assmbly.GetType("System.Windows.Forms.Form")); // frm newform.GetType().InvokeMember("Show", BindingFlags.InvokeMethod, null, newform, null); Console.ReadKey(false); }动态加载一个 System.Windows.Forms 程序集,然后获取System.Windows.Forms.Form的
类型并通过 Activator.CreateInstance 动态创建一个实例对象,其后通过反射机制动态调用
其中的 Show 方法,所以在你运行该代码时会见弹出一个空白窗口。
class A
{
public string Name { get; set; }
}
class B
{
public string Name { get; set; }
}
static void Main(string[] args)
{
A a = new A();
B b = new B();
a.Name = "你总是遥望着天";
foreach (PropertyInfo x in typeof(A).GetProperties())
{
PropertyInfo y = typeof(B).GetProperty(x.Name);
y.SetValue(b, x.GetValue(a, null), null);
}
}
有时候我们无法使用序列化的方式,我们该如何复制一个类呢?
善于利用反射会减轻我们的操作,你可以仔细研究上面的代码。
在.NET中反射是一个非常重要的东西,反射可以完成事物远比
上面的列出的还要多的多,具体就要看开发者自己如何进行抉择
原文地址:http://blog.csdn.net/u012395622/article/details/46532755