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

它是否与可见实际上是ToolStripDropDownItem基基对象的属性有关,而Enabled是ToolStripDropDownItem的"直接"属性?

如果你事先说这是什么类,就会更容易弄清楚,但现在我们知道它是ToolStripDropDownItem,我们可以推断它意味着WinForms。

你所看到的是ToolStripItem的Visible属性的一个奇怪之处。它是setter &Getter并没有直接绑定在一起。MSDN显示

" Available属性不同于Visible属性Available表示ToolStripItem是否显示,而Visible表示ToolStripItem是否显示指示是否显示ToolStripItem及其父项。设置可用或可见true或false设置另一个属性是真还是假。"

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

查看http://msdn.microsoft.com/en-us/library/system.web.ui.control.visible.aspx。也许这就是你的问题所在。

有一条非常重要的信息:

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

相关内容

  • 没有找到相关文章

最新更新