Instance|Public:获取公共的的实例属性(非静态的)
Instance|NonPublic:获取非公共的的实例属性(非静态的)。(private/protect/internal)
Static|Public:获取公共的静态属性
Static|NonPublic:获取非公共的静态属性。(private/protect/internal)
Instance|Static|Public:获取公共的的实例或静态属性
Instance|Static|NonPublic:非获取公共的的实例或静态属性
DemoCode
类型定义:
class TestClass : TestClassBase { private string pub; public string Pub { get { return pub; } set { pub = value; } } private string pubGet; public string PubGet { get { return pubGet; } } private string pubprotected; protected string Pubprotected { get { return pubprotected; } set { pubprotected = value; } } private string pubprotectedGet; protected string PubprotectedGet { get { return pubprotectedGet; } } private string pubinternal; internal string Pubinternal { get { return pubinternal; } set { pubinternal = value; } } private string pubGet_internal; internal string PubGet_internal { get { return pubGet_internal; } } private string pub_private; private string Pub_private { get { return pub_private; } set { pub_private = value; } } private string pubGet_private; private string PubGet_private { get { return pubGet_private; } } } class TestClassBase { private static string pub_static; public static string Pub_static { get { return pub_static; } set { pub_static = value; } } private static string pubGet_static; public static string PubGet_static { get { return pubGet_static; } } private static string pubprotected_static; protected static string Pubprotected_static { get { return pubprotected_static; } set { pubprotected_static = value; } } private static string pubprotectedGet_static; protected static string PubprotectedGet_static { get { return pubprotectedGet_static; } } private static string pubinternal_static; internal static string Pubinternal_static { get { return pubinternal_static; } set { pubinternal_static = value; } } private static string pubGet_internal_static; internal static string PubGet_internal_static { get { return pubGet_internal_static; } } private static string pub_private_static; private static string Pub_private_static { get { return pub_private_static; } set { pub_private_static = value; } } private static string pubGet_private_static; private static string PubGet_private_static { get { return pubGet_private_static; } } }
功能:
class Program { static void Main(string[] args) { PropertyInfo[] pis; //输出默认的方法获取的属性 Console.WriteLine("None"); pis = typeof(TestClass).GetProperties(); Console.WriteLine(typeof(TestClass).Name); pis.ToList().ForEach(s => Console.WriteLine("\t: {0}", s)); Console.WriteLine(typeof(TestClassBase).Name); pis = typeof(TestClassBase).GetProperties(); pis.ToList().ForEach(s => Console.WriteLine("\t: {0}", s)); Console.WriteLine(); //获取到全组和 var all = AllBindFlags; //已经操作过的 List<BindingFlags> lst = new List<BindingFlags>(); //遍历全组合 foreach (var child in all) { //组合转换为 BindingFlags BindingFlags v = child[0]; for (int i = 1; i < child.Count; i++) { v |= child[i]; } if (lst.Contains(v)) continue; lst.Add(v); Console.WriteLine(v); try { pis = typeof(TestClass).GetProperties(v); Console.WriteLine(typeof(TestClass).Name); pis.ToList().ForEach(s => Console.WriteLine("\t: {0}", s)); Console.WriteLine(typeof(TestClassBase).Name); pis = typeof(TestClassBase).GetProperties(v); pis.ToList().ForEach(s => Console.WriteLine("\t: {0}", s)); Console.WriteLine("*".PadRight(10, '*')); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.Read(); } Console.Read(); } private static BindingFlags[] bindFlags; public static BindingFlags[] BindFlags { get { if (Program.bindFlags == null) { List<BindingFlags> lst = new List<BindingFlags>(); foreach (var str in Enum.GetNames(typeof(BindingFlags))) { lst.Add((BindingFlags)Enum.Parse(typeof(BindingFlags), str)); } Program.bindFlags = lst.ToArray(); } return Program.bindFlags; } } private static List<List<BindingFlags>> allbindFlags; /// <summary> /// 全组合 /// </summary> public static List<List<BindingFlags>> AllBindFlags { get { if (Program.allbindFlags == null) { var val = FullCombination<BindingFlags>(new List<BindingFlags>(BindFlags)); val = val.Distinct<List<BindingFlags>>(new BindingFlagEqual()).ToList(); val.Sort(new BindingFlagCompare()); allbindFlags = val; } return Program.allbindFlags; } } public static List<T> GetEnumList<T>() { var lst = new List<T>(); foreach (T item in Enum.GetValues(typeof(T))) { lst.Add(item); } return lst; } //全组合算法 public static List<List<T>> FullCombination<T>(List<T> lstSource) { var n = lstSource.Count; var max = 1 << n; var lstResult = new List<List<T>>(); for (var i = 0; i < max; i++) { var lstTemp = new List<T>(); for (var j = 0; j < n; j++) { if ((i >> j & 1) > 0) { lstTemp.Add(lstSource[j]); } } lstResult.Add(lstTemp); } lstResult.RemoveAt(0); return lstResult; } } } class BindingFlagEqual : IEqualityComparer<List<BindingFlags>> { #region IEqualityComparer<List<BindingFlags>> 成员 public bool Equals(List<BindingFlags> x, List<BindingFlags> y) { BindingFlags bind1 = ToBind(x); BindingFlags bind2 = ToBind(y); return bind1 == bind2; } private BindingFlags ToBind(List<BindingFlags> x) { BindingFlags bind = x[0]; for (int i = 1; i < x.Count; i++) { bind = bind | x[i]; } return bind; } public int GetHashCode(List<BindingFlags> obj) { return ToBind(obj).GetHashCode(); } #endregion } class BindingFlagCompare : Comparer<List<BindingFlags>> { public override int Compare(List<BindingFlags> x, List<BindingFlags> y) { var v = x.Count.CompareTo(y.Count); if (v == 0) { BindingFlags bind1 = ToBind(x); BindingFlags bind2 = ToBind(y); return bind1.CompareTo(bind2); } return v; } private BindingFlags ToBind(List<BindingFlags> x) { BindingFlags bind = x[0]; for (int i = 1; i < x.Count; i++) { bind = bind | x[i]; } return bind; }
官方解释:为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。
指定 BindingFlags.Public 可在搜索中包含公共成员。
指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(即私有成员和受保护的成员)。
指定 BindingFlags.FlattenHierarchy 可包含层次结构上的静态成员。
下列 BindingFlags 修饰符标志可用于更改搜索的执行方式:
BindingFlags.IgnoreCase,表示忽略 name 的大小写。
BindingFlags.DeclaredOnly,仅搜索 Type 上声明的成员,而不搜索被简单继承的成员。
可以使用下列 BindingFlags 调用标志表示要对成员采取的操作:
CreateInstance,表示调用构造函数。忽略 name。对其他调用标志无效。
InvokeMethod,表示调用方法,而不调用构造函数或类型初始值设定项。对 SetField 或 SetProperty 无效。
GetField,表示获取字段值。对 SetField 无效。
SetField,表示设置字段值。对 GetField 无效。
GetProperty,表示获取属性。对 SetProperty 无效。
SetProperty 表示设置属性。对 GetProperty 无效。
BindingFlags.Instance : 对象实例
BindingFlags.Static : 静态成员
BindingFlags.Public : 指可在搜索中包含公共成员
BindingFlags.NonPublic : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)
BindingFlags.FlattenHierarchy : 指可包含层次结构上的静态成员
BindingFlags.IgnoreCase : 表示忽略 name 的大小写
BindingFlags.DeclaredOnly : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员
BindingFlags.CreateInstance : 表示调用构造函数。忽略 name。对其他调用标志无效