从内部类访问外部类字段

时间:2018-09-28 16:39:48

标签: c# winforms class

我将自定义渲染器用于ContextMenuStrip。它工作正常,但我不知道如何在类Form1中使用外部类MyColors的字段?我应该从customColor获得Form1,而不是“硬编码” Color.Green。我该如何实现?

public partial class Form1
{
    private Color customColor = Color.Red;

    private class MyRenderer : ToolStripProfessionalRenderer
    {
        public MyRenderer() : base(new MyColors()) { }
    }

    private class MyColors : ProfessionalColorTable
    {
        public override Color MenuItemSelected
        {
            get { return Color.Green; }
        }
    }
}

谢谢。

2 个答案:

答案 0 :(得分:4)

总的来说,我同意其他张贴者的观点,即一个班级应该独立存在。不过,我认为在处理私人课程时会变得有些模糊。

在少数情况下,我需要这样的东西,我将父对象传递给私有类的构造函数:

public partial class Form1
{
    public Color customColor = Color.Red;

    private class MyRenderer : ToolStripProfessionalRenderer
    {
        public MyRenderer(Form1 form) : base(new MyColors(form)) { }
    }

    private class MyColors : ProfessionalColorTable
    {
        Form1 _form;

        public MyColors(Form1 form)
        {
            _form = form;
        }

        public override Color MenuItemSelected
        {
            get { return _form.customColor; }
        }
    }
}

请注意,我必须公开Form1.customColor才能使此工作生效。这有点臭,尤其是因为现在可以从外面分配它了。在实际工作中,我会将其设置为具有公共获取器和私有设置器的属性,以便外部类无法对其进行修改。

答案 1 :(得分:1)

您将以这种方式破坏封装。如果您需要一个包含的类来从其包含的类中了解某些内容,则应在包含的类的构造函数中提供此类信息。

否则,您将让另一个类更改类的属性,从而无法控制Form1内部发生的事情。

考虑到您的代码,看来ProfessionalColorTable有一个无参数的构造函数,因此如果未设置MyColors的指向包含类的颜色的私有变量,则应该包含一个验证。使用错误的构造函数)。