一、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:希望在这里,你得难题可以得到解决。