当前位置:  开发笔记 > 编程语言 > 正文

找到一个有反射的私人领域?

如何解决《找到一个有反射的私人领域?》经验,为你挑选了7个好方法。

鉴于这门课程

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

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

我想找到我将用属性标记的私有项_bar.那可能吗?

我已经用我寻找属性的属性做了这个,但从来没有私有成员字段.

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



1> Bob King..:

使用BindingFlags.NonPublicBindingFlags.Instance标志

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


我只能通过提供"BindingFlags.Instance"绑定标志来实现此功能.
我很乐意删除我的答案,但它被标记为"已接受".
效果很好 - FYI VB.NET版本Me.GetType().GetFields(Reflection.BindingFlags.NonPublic或Reflection.BindingFlags.Instance)
仅当您想要获取实例方法时才使用实例绑定标志.如果你想获得一个私有静态方法,你可以使用(BindingFlags.NonPublic | BindingFlags.Static)

2> Abe Heidebre..:

您可以像使用属性一样执行此操作:

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


很抱歉极端的死亡发布,但这让我失望.如果找不到该属性,GetCustomAttributes(Type)将不返回null,它只返回一个空数组.

3> Suriya..:

使用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的非null实例.



4> jammycakes..:

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



5> Darren Kopp..:
typeof(MyType).GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)



6> Bruno Zell..:

带扩展方法的漂亮语法

您可以使用以下代码访问任意类型的任何私有字段:

Foo foo = new Foo();
string c = foo.GetFieldValue("_bar");

为此,您需要定义一个可以为您完成工作的扩展方法:

public static class ReflectionExtensions {
    public static T GetFieldValue(this object obj, string name) {
        // Set the flags so that private and public fields from instances will be found
        var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
        var field = obj.GetType().GetField(name, bindingFlags);
        return (T)field?.GetValue(obj);
    }
}



7> sa_ddam213..:

我亲自使用这种方法

if (typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Any(c => c.GetCustomAttributes(typeof(SomeAttribute), false).Any()))
{ 
    // do stuff
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有