1

如果我在课堂上声明以下内容:

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

谢谢!

4

5 回答 5

9

它是一个字段,而不是一个属性,所以它不会被GetProperty. 你需要使用GetField方法。

于 2012-09-18T13:31:40.380 回答
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

更多信息

于 2012-09-18T13:32:21.107 回答
1

之间有区别

private int? MyID = null;

private int? MyID { get; set; } 

第一个是字段,第二个是属性

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

于 2012-09-18T13:34:54.600 回答
0

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

private int? MyID { get { return _myID;} }

下面的代码有效,因为它是 c# 中的 Auto 属性

private int? MyID { get; set; }

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

于 2012-09-18T13:33:19.063 回答
0

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

于 2012-09-18T13:36:52.057 回答