面试之谜:访问私人数据成员

时间:2016-08-25 06:20:45

标签: c# getter-setter

我最近接受了C#问题的采访。其中一个我找不到答案。

我上了一堂课,看起来像这样:

public class Stick
{
    private int m_iLength;
    public int Length
    {
        get
        {
            return m_iLength;
        }
        set
        {
            if (value > 0)
            {
                m_iLength = value;
            }
        }
    }
}

此外,还有一个主要课程

static void Main(string[] args)
{
    Stick stick = new Stick();
}

任务是向main添加代码,这将导致Stick类中的m_iLength为负(并且强调它可以完成)。

我好像想念一些东西。数据成员是私有的,据我所知,get和set函数是int类型的值,所以我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:4)

反思始终是最直接的:

var type = typeof(Stick);
var field = type.GetField("m_iLength", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance);
field.SetValue(stick, -1);
Console.WriteLine(stick.Length);

说明:

第一行获取Type的{​​{1}}对象,因此稍后我们可以获取私有字段。

第二行获取我们想要通过其名称设置的字段。请注意,绑定标记是必需的,或Stick将是field

第三行给该字段一个负值。