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[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。对其他调用标志无效

BindingFlags说明

时间: 2024-10-10 07:35:17

BindingFlags说明的相关文章

反射中使用 BindingFlags.IgnoreCase

我们经常需要通过反射来调用目标对象的方法或获取/设置目标对象的属性,Type.InvokeMember 方法签名如下: public object InvokeMember(string name,BindingFlags invokeAttr,Binder binder,  object target,object[] args,CultureInfo culture); BindingFlags 有个枚举值是BindingFlags.IgnoreCase ,表示忽略name的大小.我在今天解

.NET反射中BindingFlags的值

BindingFlags.Default 不指定绑定标志 BindingFlags.IgnoreCase 表示忽略 name 的大小写,不应考虑成员名的大小写 BindingFlags.DeclaredOnly 只应考虑在所提供类型的层次结构级别上声明的成员.不考虑继承成员. BindingFlags.Instance 只搜索实例成员 BindingFlags.Static 只搜索静态成员 BindingFlags.Public 只搜索公共成员 BindingFlags.NonPublic 只搜

C# Reflection BindingFlags

下列 BindingFlags 筛选标志可用于定义包含在搜索中的成员: 为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static. 指定 BindingFlags.Public 可在搜索中包含公共成员. 指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(即私有成员和受保护的成员). 指定 BindingFlags.FlattenHierarchy 可包含层次结构上的静态成员. 下列 BindingFlags 修饰

反射中的BindingFlags

不指定绑定标志  BindingFlags.Default 表示忽略 name 的大小写,不应考虑成员名的大小写   BindingFlags.IgnoreCase 只应考虑在所提供类型的层次结构级别上声明的成员.不考虑继承成员    BindingFlags.DeclaredOnly 只搜索实例成员  BindingFlags.Instance 只搜索静态成员  BindingFlags.Static 只搜索公共成员  BindingFlags.Public 只搜索非公共成员(即私有成员和受保

BindingFlags 枚举

https://msdn.microsoft.com/zh-cn/library/cexkb29a 官方解释: 指定控制绑定和由反射执行的成员和类型搜索方法的标志. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合. 标识了 [ FlagsAttribute ]指示可以将枚举作为位域(即一组标志)处理.

Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案 (精髓)

前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说起.问题大概有以下几点: 1.项目层的文件夹结构 2.解决MVC的Controller和Web API的Controller类名不能相同的问题 3.给MVC不同命名空间的Area的注册不同的路由 4.让Web API路由配置也支持命名空间参数 5.MVC及Web API添加身份验证及错误处理的过滤器

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

.NET本质论

Technorati 标签: .NET,C# 1. CLR是一个更好的COM.从COM开发人员所面临的问题入手,讲述了CLR如何应用虚拟化以及无所不在的.可扩展的元数据,解决这些COM问题,从而最终取代COM. 2. 组件.从根本上讲,CLR是OS和COM加载器的替代品,本章讨论了代码是如何封装和加载的,它们与Win32和COM世界中的情形大相径庭. 3. 类型基础.组件是代码和构成f类型定义的元数据的容器.本章重点讨论了通用类型系统(Common Type System, CTS),包括类型的

HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF

服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 主体意思是微软没有容忍不符合RFC 822中的httpHeader必须以CRLF结束的规定的服务器响应. 一个解决方案是在application.config或web.config文件里加入 <