我可以在不使用类对象的情况下访问私有成员吗?
不,您必须有一个对象的实例才能从该对象中提取数据。
无意冒犯,但由于构造函数重载,您对使用反射的犹豫似乎没有实际意义。如果你有一个实例,它不应该阻止你使用反射,如果你没有,它不应该阻止你使用反射。
这是一个使用反射获取值的示例_ink
。它还向您展示了如何在不使用构造函数的情况下获取实例。但是,请记住,不会初始化任何内容。_ink
将0
不是1000
你在代码中看到的那样。
public class Pen
{
int _ink = 1000;
public Pen(int ink)
{
_ink = ink;
}
}
void Test()
{
//Create the object and check constructor set the value
var pen = new Pen(5);
var field = pen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
// This should pass.
Debug.Assert((int)field.GetValue(pen) == 5);
// Create the pen without using constructor.
// No matter what, nothing is initialized meaning _ink is 0 and not 1000.
// Hence, uninitialized.
var uninitializedPen = (Pen)FormatterServices.GetUninitializedObject(typeof(Pen));
field = uninitializedPen.GetType().GetField("_ink", BindingFlags.NonPublic|BindingFlags.Instance);
//This will fail.
Debug.Assert((int)field.GetValue(uninitializedPen) == 1000);
}
为了使用FormatterServices
该类,您需要导入System.Runtime.Serialization
命名空间。