面试谜题:访问私有数据成员

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);

解释:

第一行获取 StickType 对象,因此我们稍后可以获取私有字段。

第二行通过名称获取我们要设置的字段。请注意,绑定标志是必需的,否则 field 将是 null.

第三行给字段一个负值。