【问题标题】:Find a private interface field with Reflection? [duplicate]用反射找到一个私有接口字段? [复制]
【发布时间】:2009-11-11 07:54:13
【问题描述】:

给定这个类

public partial class Default : Page
{
    private IRepository repo;
    ...
}

我想查找并设置私有repo 字段。那可能吗?

更新

我尝试使用GetFields(BindingFlags.NonPublic),它返回{System.Reflection.FieldInfo[0]}

更新二

我尝试使用GetFields(BindingFlags.NonPublic | BindingFlags.Instance) ,它返回Page 的所有字段,但不返回repo

【问题讨论】:

    标签: c# reflection webforms


    【解决方案1】:

    使用允许您指定标志的GetFields 重载:

    GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    

    【讨论】:

    • 我冒昧地添加了 BindingFlags.Instance。如果你没有指定你得到的标志(BindingFlags.Public | BindingFlags.Instance),但如果你指定任何你只得到你指定的那些,所以你需要实例或静态来获得任何结果。
    • 不要忘记它只会返回当前类型的字段,如果字段是在基类中定义的,您可能必须沿着层次结构走。
    • Jb Evain:当我将 'repo' 更改为 public 时,它确实有效,只是当我将其更改为 private 时,它​​不会出现。
    【解决方案2】:

    您可以使用以下代码:

    MemberInfo[] mi = System.Runtime.Serialization.FormatterServices.GetSerializableMembers(MyType);

    并转换 FieldInfo fi = (FieldInfo) mi[i]; 此代码返回可序列化成员(私有)

    【讨论】:

    • 为了使用您的解决方案,我的页面需要可序列化,这是唯一的方法吗??
    • 是的,我认为还有另一种方法,它使用 Visual Studio 中的 Quick Watch 之类的调试服务,但您需要 .pdb 文件
    猜你喜欢
    • 2019-01-23
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2014-04-13
    • 2013-02-25
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多