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. MAC OS X 终端命令入门

    在这里记下..防止丢失 pwd 当前工作目录 cd(不加参数) 进root cd(folder) 进入文件夹 cd .. 上级目录 cd ~ 返回root cd - 返回上一个访问的目录 rm 文件名 ...

  2. iOS ifdef ifndef endif

    #ifdef DEBUG //标识符//定义过执行#else//未定义过执行#endif #ifndef DEBUG//标识符//未定义过执行#else//定义过执行#endif #if (5> ...

  3. [整理]Linux下的源码安装步骤及其功能解释

    源码的安装一般由3个步骤组成:配置(./configure).编译(make).安装(make install). 这时最常用的命令就是这三个--./configure && make ...

  4. 2.启动ABP ASP.NET ZERO

    1.使用VS2017打开项目,等待自动还原程序包结束 2.生成项目,确保项目全部生成成功 3.生成数据库 (1).将项目“MyCompanyName.AbpZeroTemplate.EntityFra ...

  5. iOS学习笔记02-UIScrollView

    父类UIView方法 // autoresizingMask - 现在基本弃用,改用autoLayout typedef NS_OPTIONS(NSUInteger, UIViewAutoresizi ...

  6. 【bzoj4269】再见Xor 高斯消元求线性基

    题目描述 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 输入 第一行一个正整数N. 接下来一行N个非负整数. 输出 一行,包含两 ...

  7. ACM程序设计选修课——1076汇编语言(重定向+模拟)

    1076: 汇编语言 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 34  Solved: 4 [Submit][Status][Web Board] ...

  8. social-auth-app-django模块

    一 原文地址:http://www.cnblogs.com/adc8868/p/7665864.html social-auth-app-django模块是专门用于Django的第三方登录OAuth2 ...

  9. bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题

    题目大意 给定n种权值 给定m \(F_i表示权值和为i的二叉树个数\) 求\(F_1,F_2...F_m\) 分析 安利博客 \(F_d=F_L*F_R*C_{mid},L+mid+R=d\) \( ...

  10. Linux System Programming 学习笔记(一) 介绍

    1. Linux系统编程的三大基石:系统调用.C语言库.C编译器 系统调用:内核向用户级程序提供服务的唯一接口.在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间 用户程序通过寄 ...