public class NGlbGlobeXComm

{

    public static T GetPrivateField<T>(object instance, string fieldname)
            {                
                BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
                Type type = instance.GetType();
                FieldInfo field = type.GetField(fieldname, flag);
                T to = default(T);
                try
                {
                    to = (T)field.GetValue(instance);
                }catch(Exception e){}
                return to;
            }

}

public class NGlbFieldX : NObjectSafety, INGlbFieldX
 {
            private string mpr_org = null;
            public NGlbFieldX()
            {
                mpr_org = new NGlbField();
            }

}

如果需要获取NGlbFieldX中的mpr_org成员 使用如下语句

string fd = NGlbGlobeXComm.GetPrivateField<string>(field, "mpr_org");

即可得到。

参考:

一般而言,非公共成员是受保护的,不能被外部访问的,这些都是基于安全性考虑。可是有时,我们很想取到非公共成员的某个对象。那我们就得用到两个方法:

GetType().GetField();

GetType().GetProperty();

GetField()用来获取字段,GetProperty()用来获取属性。

 
示例:
如图,我要获取_row和Row的值。
    protected void GV_Event_RowCommand(object sender, GridViewCommandEventArgs e)         {             if (e.CommandName == "gvwEventLinkButton")             {                 //_row  前面蓝色小图标,是变量(字段),  他是私有成员                   //Row  前面白色小图标,是属性 ,他是保护乘员(白色图标上有个H的区域)                   //是字段还是属性,根据命名也能看出来                    //根据调试时查看,Row类型是GridViewRow                   GridViewRow row = null;                 System.Reflection.FieldInfo fRow = e.GetType().GetField("_row", BindingFlags.Instance | BindingFlags.NonPublic);                 row = fRow.GetValue(e) as GridViewRow;                 int rowIndex = row.RowIndex;                 GridViewRow row2 = null;                 System.Reflection.PropertyInfo pRow = e.GetType().GetProperty("Row", BindingFlags.Instance | BindingFlags.NonPublic);                 row2 = pRow.GetValue(e, null) as GridViewRow;                 int rowIndex2 = row2.RowIndex;                  //如果RowIndex仍然是非公成员,可以同理对row进行反射操作               }         }
 
 
深入:
如图,两者都有相似的参数类型,可以只输入要搜索的Name参数,也可以额外加入负责搜索执行方式的参数BindingAttr。
      BindingAttr的参数大体如下(来自MSDN):
      指定 BindingFlags.Public 可在搜索中包含公共字段。
      指定 BindingFlags.NonPublic 可在搜索中包含非公共字段(即私有字段、内部字段和受保护的字段)。
      指定 BindingFlags.FlattenHierarchy 以便沿层次结构向上包括public 和protected 静态成员;不包括继承类中的private 静态成员。
      BindingFlags.IgnoreCase,表示忽略name 的大小写。

BindingFlags.DeclaredOnly,表示仅搜索在Type 上声明的字段,而不搜索简单继承的字段。

C#中通过反射获取类中非公有成员的更多相关文章

  1. php反射获取类和方法中的注释

    通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...

  2. c#通过反射获取类上的自定义特性

    c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...

  3. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

  4. java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

    首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...

  5. C#中使用反射获取结构体实例

    一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...

  6. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  7. java中使用反射获取pojo(实体)类的全部字段值

    说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...

  8. java中使用反射获取pojo(实体)类的所有字段值

    出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...

  9. PHP反射获取类中的所有常量

    <?php// Yii 2// namespace yournamespace;// use Yii; /** * 缓存辅助类 */ class CacheHelper { /** * 缓存键 ...

随机推荐

  1. selenium - 常用元素操作

    # 3.常用元素操作 # 元素对象的获取ele = driver.find_element_by_XXX('定位表达式') # 获取元素的文本内容(返回值为元素的文本)ele.text # 获取元素的 ...

  2. 缓存淘汰算法之FIFO

    前段时间去网易面试,被这个问题卡住,先做总结如下: 常用缓存淘汰算法 FIFO类:First In First Out,先进先出.判断被存储的时间,离目前最远的数据优先被淘汰. LRU类:Least ...

  3. python随机数的产生

    导入 random模块  >>> import random 1.  random.random random.random()用于生成一个0到1的随机浮点数: 0 <= n ...

  4. iOS使用cookie

    // // ViewController.m // cookie // // Created by 谭启宏 on 16/3/4. // Copyright © 2016年 tqh. All right ...

  5. 【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra

    题目描述 2255是一个傻X,他连自己家灯不亮了都不知道.某天TZ大神路过他家,发现了这一情况,于是TZ开始行侠仗义了.TZ发现是电路板的问题,他打开了电路板,发现线路根本没有连上!!于是他强大的脑力 ...

  6. 如何在github上寻找漏洞

    https://github.com/search?p=2&q=eval%28%24_POST[&ref=searchresults&type=Code   1.$_GET s ...

  7. 爬虫【自动登陆github和抽屉】

    自动登陆github用户详情页 代码 #! /usr/bin/env python # -*- coding: utf- -*- # __author__ = "wuxiaoyu" ...

  8. uva 10828 高斯消元求数学期望

    Back to Kernighan-RitchieInput: Standard Input Output: Standard Output You must have heard the name ...

  9. 完全平方数(bzoj 2440)

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...

  10. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...