C# 我是否可以使用反射来检测控件';谁支持透明背景?

C# 我是否可以使用反射来检测控件';谁支持透明背景?,c#,winforms,reflection,C#,Winforms,Reflection,我使用以下代码将控件的BackColor属性一般设置为Color.Transparent: protected override void OnItemAdded(ToolStripItemEventArgs e) { base.OnItemAdded(e); Type t = e.Item.GetType(); PropertyInfo pInfo = t.GetProperty("BackColor"); if (pInfo != null)

我使用以下代码将控件的
BackColor
属性一般设置为
Color.Transparent

protected override void OnItemAdded(ToolStripItemEventArgs e)
{
    base.OnItemAdded(e);
    Type t = e.Item.GetType();
    PropertyInfo pInfo = t.GetProperty("BackColor");
    if (pInfo != null)
        pInfo.SetValue(e.Item, Color.Transparent, null);
}
当然,当所讨论的控件不支持它时,我会得到一个
ArgumentException
。因此,我想检查一下是否存在这种支持


如何完成此检查?

我相信只有继承自
ToolStripControlHost
的类才有不支持“透明背景色”的限制,因此只有当
ToolStripItem
ToolStripControlHost
时才可以安全地进行检查,否则您可以假定它是受支持的(不过要正确地测试它)


其中
textBox1
TextBox
的实例,
label1
Label

为什么在这里需要反射<代码>项来自
控件
,因此您可以直接访问
背景色
属性。我遗漏了什么吗?@Leri他肯定需要它,他需要检查
BackColor
是否可以设置为
Color。Transparent
或not:)@Leri这是不正确的。该方法正在接收
ToolStripItemEventArgs
,这意味着
e.Item
是一个
ToolStripItem
,它不是从
Control
@DonBoitnott My bad派生的。但是,
ToolStripItem
具有属性。因此,我的问题仍然有效。@Ler我盲目地设置该属性正是这个问题必要的原因。例如,在
ToolStripTextBox
上试试。既然
e.Item
ToolStripItem
而不是
Control
,我如何在没有大量额外检查的情况下实现这一点?更新了我的答案,检查一下是否满足您的要求“乍一看,这看起来像是一个赢家。”。非常感谢。
private bool SupportsTransparentBackColor(ToolStripItem item)
{
    var host = item as ToolStripControlHost;
    if (host != null)
    {
        return SupportsTransparentBackColor(host.Control);
    }
    return true;
}

private bool SupportsTransparentBackColor(Control control)
{
    MethodInfo getstyle = typeof(Control).GetMethod("GetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
    return (bool)getstyle.Invoke(control, new object[] { ControlStyles.SupportsTransparentBackColor });
}

bool textboxResult = SupportsTransparentBackColor(textBox1);//false
bool labelResult = SupportsTransparentBackColor(label1);//true