在反射中寻找私密领域?

时间:2020-03-06 14:23:03  来源:igfitidea点击:

鉴于这个班

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

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

我想找到要用属性标记的私人物品_bar。那可能吗?

我在寻找属性的属性中完成了此操作,但从未使用私有成员字段。

我需要设置哪些绑定标志才能获取私有字段?

解决方案

是的,但是我们将需要设置Binding标志以搜索私有字段(如果我们在类实例之外寻找成员)。

我们将需要的绑定标志是:System.Reflection.BindingFlags.NonPublic

typeof(MyType).GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)

我们可以像使用属性一样进行操作:

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

使用BindingFlags.NonPublicBindingFlags.Instance标志

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

在考虑私有成员时,需要注意的一件事是,如果应用程序以中等信任度运行(例如,当我们在共享托管环境中运行时),它将找不到它们-BindingFlags .NonPublic选项将被忽略。