.NET PropertyInfo.SetValue似乎忽略了我的命令

时间:2011-07-15 16:54:15

标签: c# .net reflection propertyinfo setvalue

正如主题所示,我对PropertyInfo.SetValue存在一些问题。为了达到目的,这是我的例子 - 我创建了自己的类,关于它的主要内容是表示对象:

using System;
using System.Reflection;

namespace TestingSetValue
{
public class Link
{
    private object presentationObject = null;
    private string captionInternal = string.Empty;

    public Link (string caption)
    {
        captionInternal = caption;
    }

    public string CaptionInternal
    {
        get { return captionInternal; }
        set { captionInternal = value; }
    }

    public bool Visible
    {
        get 
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    return Convert.ToBoolean(pi.GetValue(PresentationObject, null));
                }
            }

            return true;
        }

        set
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    pi.SetValue(PresentationObject, (bool)value, null);
                }
            }
        }
    }

    public object PresentationObject
    {
        get { return presentationObject; }
        set { presentationObject = value; }
    }

}

}

然后,我这样做:

private void btnShowLink_Click(object sender, EventArgs e)
    {
        Link link = new Link("Here I am!");

        this.contextMenu.Items.Clear();
        this.contextMenu.Items.Add(link.CaptionInternal);

        link.PresentationObject = this.contextMenu.Items[0];
        link.Visible = true;

        lblCurrentVisibility.Text = link.Visible.ToString();
    }

现在,我可以想象这看起来不太合乎逻辑/经济,但它显示了我真正问题的本质。也就是说,在我打电话之后,为什么表示对象的可见性(以及link.Visible的值)没有变化:

link.Visible = true;

我根本不知道还有什么可以做这项工作......非常感谢任何帮助。

为了使事情变得更有趣,属性Enabled的行为符合预期......

PropertyInfo pi = PresentationObject.GetType().GetProperty("Enabled");

它是否与Visible实际上是ToolStripDropDownItem基础对象的属性有关,而Enabled是ToolStripDropDownItem的'direct'属性?

2 个答案:

答案 0 :(得分:1)

检查http://msdn.microsoft.com/en-us/library/system.web.ui.control.visible.aspx。也许这会导致你的问题。

有一个非常重要的信息:

  

如果此属性为false,则不呈现服务器控件。在组织页面布局时,您应该考虑到这一点。如果未呈现容器控件,即使将单个控件的Visible属性设置为true,也不会呈现其包含的任何控件。在这种情况下,即使您已将其明确设置为true,单个控件也会为Visible属性返回false。 (即,如果父控件的Visible属性设置为false,则子控件将继承该设置,并且该设置优先于任何本地设置。)

答案 1 :(得分:1)

如果你提前说过这是什么类,那就更容易弄明白了,但现在我们知道它是ToolStripDropDownItem,我们可以推断出它意味着WinForms。

您所看到的是ToolStripItem的Visible属性的一个奇怪之处。它的制定者和吸气剂不直接绑在一起。 MSDN说

  

“可用属性与Visible属性不同   Available表示是否显示ToolStripItem,而Visible   指示是否显示ToolStripItem及其父项。设置   可用或可见为true或false设置其他属性   是真还是假。“

换句话说,您希望使用Available属性而不是Visible属性