没有Getter / Setter的反思?

时间:2012-09-18 13:29:44

标签: c# .net reflection properties runtime

如果我在课堂上宣布以下内容:

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以使反射起作用?

谢谢!

5 个答案:

答案 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; } 

第一个是field,第二个是property

尝试通过反射查找字段时,应使用Type.GetField()方法。

答案 3 :(得分:0)

您应该创建一个属性来访问类中的变量。所以你手动创建一个像

这样的属性
private int? MyID { get { return _myID;} }

以下代码有效,因为它是c#

中的自动属性
private int? MyID { get; set; }

参考http://msdn.microsoft.com/en-us/library/bb384054.aspx

答案 4 :(得分:0)

我的逻辑声明第一个是一个简单变量,第二个是属性,因为它有get / set,所以要使“GetProperty”工作,它需要是一个属性。如果你想要一个变量,你需要GetField