面试谜题:访问私有数据成员
An interview riddle: accessing a private data member
最近面试了C#题。其中一个我找不到答案。
我得到了一个 class,看起来像这样:
public class Stick
{
private int m_iLength;
public int Length
{
get
{
return m_iLength;
}
set
{
if (value > 0)
{
m_iLength = value;
}
}
}
}
此外,还给出了主要 class
static void Main(string[] args)
{
Stick stick = new Stick();
}
任务是将代码添加到 main 中,这将导致 Stick class 中的 m_iLength
为负数(并强调可以完成)。
我好像漏掉了什么。数据成员是私有的,据我所知,get 和 set 函数是按 int 类型的值计算的,所以我不知道如何做到这一点。
反思永远是最直接的:
var type = typeof(Stick);
var field = type.GetField("m_iLength", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance);
field.SetValue(stick, -1);
Console.WriteLine(stick.Length);
解释:
第一行获取 Stick
的 Type
对象,因此我们稍后可以获取私有字段。
第二行通过名称获取我们要设置的字段。请注意,绑定标志是必需的,否则 field
将是 null
.
第三行给字段一个负值。
最近面试了C#题。其中一个我找不到答案。
我得到了一个 class,看起来像这样:
public class Stick
{
private int m_iLength;
public int Length
{
get
{
return m_iLength;
}
set
{
if (value > 0)
{
m_iLength = value;
}
}
}
}
此外,还给出了主要 class
static void Main(string[] args)
{
Stick stick = new Stick();
}
任务是将代码添加到 main 中,这将导致 Stick class 中的 m_iLength
为负数(并强调可以完成)。
我好像漏掉了什么。数据成员是私有的,据我所知,get 和 set 函数是按 int 类型的值计算的,所以我不知道如何做到这一点。
反思永远是最直接的:
var type = typeof(Stick);
var field = type.GetField("m_iLength", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance);
field.SetValue(stick, -1);
Console.WriteLine(stick.Length);
解释:
第一行获取 Stick
的 Type
对象,因此我们稍后可以获取私有字段。
第二行通过名称获取我们要设置的字段。请注意,绑定标志是必需的,否则 field
将是 null
.
第三行给字段一个负值。