C# 反射机制(.NET Refection)

版权所有,禁止匿名转载;禁止商业使用。

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中反射是一个非常重要的东西,反射可以完成事物远比


上面的列出的还要多的多,具体就要看开发者自己如何进行抉择


0 0
登录后参与讨论。点击登录