正如主题所建议的那样,我对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,则子控件继承该设置,并且该设置优先于任何本地设置)