正如主题所示,我对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'属性?
答案 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属性