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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值