.NET Refection机制是从RTTI+COM机制演化过来的,原RTTI机制内所包含的二进制
字节存在程序中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")); // frmnewform.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中反射是一个非常重要的东西,反射可以完成事物远比
上面的列出的还要多的多,具体就要看开发者自己如何进行抉择
既有美妙的风景,也会有称不上景、只有风的地方。