如果我在课堂上宣布以下内容:
private int? MyID = null;
然后尝试通过反射访问它,它将无法找到它。我的意思是,下面将gProp设置为null:
gType = refObj.GetType();
gProp = gType.GetProperty(PropertyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
但是,如果我将其声明为:
,它将正常工作private int? MyID { get; set; }
这对我来说并不令人惊讶,因为我已经知道这是事实。但是,我想证实一下;无论如何要使第一个声明用反射工作,或者我是否提供了一个Getter / Setter以使反射起作用?
谢谢!
答案 0 :(得分:9)
这是一个字段,而不是一个属性,因此GetProperty
不会返回它。您需要使用GetField
方法。
答案 1 :(得分:5)
对于字段,您需要GetField
方法(而不是GetProperty
)。
Type.GetFields方法 使用指定的绑定约束搜索指定的字段。
// your instance
MyObject instance = new MyObject();
// get type information
Type myType = typeof(MyObject);
// get field information
FieldInfo fieldInfo = myType.GetField("MyID");
// set some value
fieldInfo.SetValue(instance, 123);
// get field value
var value = fieldInfo.GetValue(instance);
// value is 123
答案 2 :(得分:1)
之间存在差异
private int? MyID = null;
和
private int? MyID { get; set; }
尝试通过反射查找字段时,应使用Type.GetField()
方法。
答案 3 :(得分:0)
您应该创建一个属性来访问类中的变量。所以你手动创建一个像
这样的属性private int? MyID { get { return _myID;} }
以下代码有效,因为它是c#
中的自动属性private int? MyID { get; set; }
答案 4 :(得分:0)
我的逻辑声明第一个是一个简单变量,第二个是属性,因为它有get / set,所以要使“GetProperty”工作,它需要是一个属性。如果你想要一个变量,你需要GetField