有了这个课程

class Foo
{
    // Want to find _bar with reflection
    [SomeAttribute]
    private string _bar;

    public string BigBar
    {
        get { return this._bar; }
    }
}

我想找到私有项目_bar,我将标记一个属性。这可能吗?

我已经对属性进行了此操作,我在其中查找了属性,但从未查找私有成员字段。

我需要设置哪些绑定标志来获得私有字段?


当前回答

使用Reflection获取私有变量的值:

var _barVariable = typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(objectForFooClass);

使用Reflection为私有变量设置值:

typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(objectForFoocClass, "newValue");

其中objectForFooClass是类类型Foo的非空实例。

其他回答

在反射私有成员时需要注意的一件事是,如果您的应用程序运行在中等信任环境中(例如,当您运行在共享托管环境中时),它将找不到它们——BindingFlags。非公共选择将被忽略。

使用BindingFlags。NonPublic和BindingFlags。实例的旗帜

FieldInfo[] fields = myType.GetFields(
                         BindingFlags.NonPublic | 
                         BindingFlags.Instance);

你可以像对待属性那样做:

FieldInfo fi = typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fi.GetCustomAttributes(typeof(SomeAttribute)) != null)
    ...
typeof(MyType).GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)

我在谷歌上搜索这个时遇到了这个,所以我意识到我在撞一个旧帖子。然而GetCustomAttributes需要两个参数。

typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(x => x.GetCustomAttributes(typeof(SomeAttribute), false).Length > 0);

第二个参数指定是否希望搜索继承层次结构