C#中反射Reflection的一些难点 关于Binding的

一、Module是什么

下面先看示例代码

这是Main函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace Reflection我爱你
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Assembly assembly = Assembly.Load("Model");
            Module[] mds = assembly.GetModules();
            Type[] tps = assembly.GetTypes();

            foreach (var item in tps)
            {
                Console.WriteLine(item.Name + "\n" + item.Module + "\n" + item.Namespace + "\n" );
            }

            
            Console.WriteLine(assembly.FullName);
            Console.ReadKey();

        }
    }
}

这是Person类 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model
{
    public class Person
    {
        public string name;
        public int id;

        public Person() { }

        public Person(string name,int id)
        {
            this.name = name;
            this.id = id;
        }

        public void Show()
        {
            Console.WriteLine("我叫{0},我的ID是{1}", name, id);
        }
    }
}

以上代码的结果是

可见这里 Model是命名空间,Model.dll被认为是Module。

 

二、我们对于通过反射获取类的成员(Members)时如何获取他们的 Private 声明过的成员

在这里我们要理解一个叫BindingFlags这个enum,在type.GetMembers(BindingFlags flags)这个函数里面,是有这个参数的。这个参数的作用就是用来控制获取的成员的类型。

下面的代码是获取该class的所有public和非public的所有成员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Reflection我爱你
{
    class Person
    {
        public string name;
        public int Id;
        public int whatsmyname;

        private string Gender;
        private int age;
        private bool isHaveXiaoJiJi;



        public void Method1() {
            Console.WriteLine("这是Method1 public");
        }

        public void Method2()
        {
            Console.WriteLine("这是Method2");
        }
        
        private void Method3()
        {
            Console.WriteLine("这是一个Private 方法");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace Reflection我爱你
{
    class Program
    {
        static void Main(string[] args)
        {

            Type personT = typeof(Person);

            MemberInfo[] mbi = personT.GetMembers(BindingFlags.Instance | BindingFlags.Public|BindingFlags.NonPublic);
        

            foreach (var item in mbi)
            {
                Console.WriteLine(item.Name);
            }


         
            Console.ReadKey();


        }
    }
}

看到这里你可能是可以运行 并且看到这个类的所有的私有成员,但是自己却很难搞懂这个BindingFlags,我也研究了半小时才搞懂的,下面看我说。

首先这个BindingFlags.Instance是一定要有的,它表示显示这个类的实例的成员,然后BindingFlags.Public控制Public成员,BindingFlags.NonPublic控制非public成员。

总结就是BindingFlags.Instance+BindingFlags.Public或BindingFlags.NonPublic。

BindingFlags.Instance是一定要有的

BindingFlags.Public 和 BindingFlags.NonPublic 不能都没有,可以有一个或都有。

 

##@##

BindingFlags.DeclaredOnly 这个是只包含自己的成员,不包含父类成员。

BindingFlags.Static 包含静态的成员

 

 

 

ps:希望在这里,你得难题可以得到解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这本书是什么? * 这本电子书严格来说是我复习C#基础知识来的,我从09年初开始使用asp.net进行b/s开发,之前一直使用asp。在实际开发深感C#的强大,也深深感到自身基础知识的欠缺,因此重新从头开始学习C#,在学习的过程最主要是借助Illustrator C# 2008(译名:插图详解C#2008或C#图解教程)这本书,(准确讲,这本电子书可以说是我对Illustrator C# 2008的读书笔记)同时查阅了msdn及许多相关的资料 ,前后近两个月;但本系列尚未完成,目前还有多线程及涉及C# 3.0的新知识没有完成。 * 这本书有什么? * 本电子书一共21节,主要包含本人实际项目自我感到难点的东西,如委托、事件、泛型等,进行了个人的一些总结的归纳,最后附一个我做的WinForm程序。 * 这本书适合哪些人? * 这本书内容其实很少,你可以很快就可看完;内容也只是十分简陋,主要是我本人在实现应用的体会的难点问题的总结。再加上我本人技术水平十分有限,因此我要提前声明:由于内容简略,不适合新手,以免误人子弟;内容浅显,更不适合老鸟。我本人也是抱着交流学习的目的将它发布的,欢迎大家针对本书内容的问题进行交流探讨。 * 最后,极力向大家推荐Illustrator C# 2008,不要被它的名字迷惑,认为它只是一本入门级的读物;作者是技术专家,对C#有极其深刻的见解;语言十分流畅,书的插图十分形象易懂,从头到尾内容循序渐进,层层递进,尤其对内存分配有着详尽的描述。无论是新手还是老手,绝对值得一读。文版翻译也还可以,如果英文好的话建议直接阅读英文版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值