鉴于这门课程
class Foo { // Want to find _bar with reflection [SomeAttribute] private string _bar; public string BigBar { get { return this._bar; } } }
我想找到我将用属性标记的私有项_bar.那可能吗?
我已经用我寻找属性的属性做了这个,但从来没有私有成员字段.
获取私有字段需要设置哪些绑定标志?
使用BindingFlags.NonPublic
和BindingFlags.Instance
标志
FieldInfo[] fields = myType.GetFields( BindingFlags.NonPublic | BindingFlags.Instance);
您可以像使用属性一样执行此操作:
FieldInfo fi = typeof(Foo).GetField("_bar", BindingFlags.NonPublic | BindingFlags.Instance); if (fi.GetCustomAttributes(typeof(SomeAttribute)) != null) ...
使用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实例.
反思私有成员时需要注意的一件事是,如果您的应用程序以中等信任的方式运行(例如,当您在共享托管环境中运行时),它将无法找到它们 - BindingFlags.NonPublic选项将被忽略.
typeof(MyType).GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)
您可以使用以下代码访问任意类型的任何私有字段:
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); } }
我亲自使用这种方法
if (typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Any(c => c.GetCustomAttributes(typeof(SomeAttribute), false).Any())) { // do stuff }