GetProperties(BindingFlags)说明
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[];
for (int i = ; 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(, '*'));
}
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 = << n;
var lstResult = new List<List<T>>();
for (var i = ; i < max; i++)
{
var lstTemp = new List<T>();
for (var j = ; j < n; j++)
{
if ((i >> j & ) > )
{
lstTemp.Add(lstSource[j]);
}
}
lstResult.Add(lstTemp);
}
lstResult.RemoveAt();
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[];
for (int i = ; 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 == )
{
BindingFlags bind1 = ToBind(x);
BindingFlags bind2 = ToBind(y);
return bind1.CompareTo(bind2);
} return v;
} private BindingFlags ToBind(List<BindingFlags> x)
{ BindingFlags bind = x[];
for (int i = ; 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。对其他调用标志无效
GetProperties(BindingFlags)说明的更多相关文章
- 【C#反射】BindingFlags 枚举
BindingFlags 枚举用途:Type的类方法中,用于筛选成员. type.InvokeMember方法中 type.GetConstructor 方法中 type.GetFiles方法中 ty ...
- MongoDB学习笔记~对集合属性的操作
回到目录 $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$ ...
- Autofac 的点滴
泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...
- [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店
一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...
- .net两个对象比较,抛出不一样字段的结果
现在应该经常用到记录操作日志,修改和新增必定涉及到两个实体的属性值的变动. 利用反射,将变动记录下来. 切记,类中的属性字段上面需要打上Description标签: 例如: /// <summa ...
- 我的EF功能
由来 话说这个功能想法由来与java的Hibernate功能,我需要一个类和数据库映射,很简单的写一个实体类简单配置一下就ok了, 很是方便, package com.game.po.log; imp ...
- 简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
- Autofac 的属性注入,IOC的坑
Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...
- 编写轻量ajax组件03-实现(附源码)
前言 通过前两篇的介绍,我们知道要执行页面对象的方法,核心就是反射,是从请求获取参数并执行指定方法的过程.实际上这和asp.net mvc框架的核心思想很类似,它会解析url,从中获取controll ...
随机推荐
- 关于WebView的内存泄露问题
在一个Activity中包含着一个WebView,通过WebView不停的访问Web页面,会发现内存会一直增长,退出此Activity,甚至杀死此Activity,内存依然没有被释放.这就导致,即使是 ...
- Redis应用
一.什么是Redis? Redis是一个高性能的key-value内存数据库. 二.为什么使用Redis? Redis是NoSQL数据库,相比传统关系型数据库,内存数据库读写更快. 三.Redis怎么 ...
- php 深入理解addslashes函数
php addslashes函数对于很多人来说并不陌生,但很大部分人只是了解皮毛,只知道addslashes函数是在特定字符前面加上反斜杠,本文章将带大家深入理解php addslashes函数的使用 ...
- Redis集群搭建&访问
集群搭建步骤 1.创建多个节点: 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群: 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态: 要求:搭建一个包含6个节点的Redi ...
- Bootstrap 3 How-To #3 布局
对于 Web 开发来说,一个永远的话题是如何创建一个跨浏览器兼容的布局.许多年来,各种框架使用各种技术来解决这个问题.Bootstrap 使用了一个不同的方式来解决这个问题.基于 960 像素的布局 ...
- apk重新签名
re-sign.jar中后自动去除签名这个方法,经试验不可用! 1.去除准备重新签名SinaVoice.apk软件本身的签名 将apk文件后缀改为.zip,然后从winrar中删除META-INF文件 ...
- QQ音乐API
今天分享的是QQ音乐API 搜索歌曲API:http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0& amp;n={2}&am ...
- ios 获取通讯录的所有信息
iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...
- 'UIShell.OSGi.MvcWebExtension.BundleRuntimeControllerFactory' did not return a controller for the name 'Home'.
在使用osgi.net 框架的时候,有时会遇到这样的错误: 解决办法: 1. 检查项目文件夹下的 log 日志文件,因 osgi.net 在运行时(包括异常和操作)都会在项目的目录下生成 日志文件,并 ...
- 【Hibernate 9】悲观锁和乐观锁
一.锁的基本简介 1.1,为什么需要锁 首先,锁的概念产生,主要是为了解决并发性的问题.什么是并发性问题呢,比如: Angel现在银行有个账号,里面有存款1000块.现在,Angel的账户,在两个地方 ...