自定义控件的类型检查失败?

时间:2014-11-05 03:24:18

标签: c# winforms types

我有一个自定义类,它扩展在ParentNamespace.Controls.NumberBox.cs中定义的TextBox,它位于自己的目录中。

namespace ParentNamespace
{
    namespace Controls
    {
        public class NumberBox : TextBox
        {
            //...
        }
    }
}

我创建了一个名为ColumnControl的UserControl,其上有一个NumberBoxColumnControl是它自己的项目,它包含ParentNamespace.Controls.NumberBox.cs作为链接的现有项目。

我有一个Windows窗体项目,在其窗体上添加ColumnControl,并且还将ParentNamespace.Controls.NumberBox.cs引用为链接的现有项目。

现在遇到麻烦了:

在我的WinForms项目中,我试图对表单上的所有控件进行类型检查,以查找所有TextBox和所有NumberBox控件。类型检查适用于TextBox内的ColumnControl控件。但是,由于某种原因,我无法在NumberBox上检测到ColumnControl

每个控件都会运行此代码:

private static IEnumerable<Control> EnumerateControlsByType(Control control, Type type = null)
{
    IEnumerable<Control> controls = control.Controls.Cast<Control>();

    foreach (Control c in controls)
    {
        Debug.WriteLine(c.Name + " = " + c.GetType().ToString() + "  [== " + type.ToString() + "? " + (c.GetType() == type).ToString() + "]");
    }

    return controls.SelectMany(ctrl => EnumerateControlsByType(ctrl, type))
                              .Concat(controls)
                              .Where(c => (type == null || c.GetType() == type));
    }
}

调试看起来像这样:

myTextBox = System.Windows.Forms.TextBox  [== System.Windows.Forms.TextBox? True]
//...
myNumberBox = ParentNamespace.Controls.NumberBox  [== ParentNamespace.Controls.NumberBox? False]

正如您所看到的,GetType()字符串与myNumberBox的字符串完全相同,而且我传递给EnumerateControlsByType的类型,我只是传递类型:

typeof(ParentNamespace.Controls.NumberBox)

但是,但是typecheck返回false,我无法检测到NumberBox

任何人都知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

请勿使用“添加为链接”。即使你知道它是同一个班级,你的程序也不会。它将多个文件视为具有不同类型的不同类。

如果您需要从多个项目中引用您的类,请将该类放在单独的项目中,右键单击“引用”并选择“添加引用”以添加该项目。

答案 1 :(得分:0)

重新阅读经过大量编辑的问题,我看到了问题:

  

ColumnControl是它自己的项目,其中包含ParentNamespace.Controls.NumberBox.cs作为链接的现有项目

即。您已在两个不同的程序集中声明NumberBox类型。程序中的那个和作为枚举方法的类型传递的那个与UserControl程序集中的那个完全不同(并且在实际形式中使用)。

您应该只在NumberBox程序集中声明UserControl类型,然后从程序中引用该类型,而不是链接源代码。或者,如果您想在不需要NumberBox程序集的上下文中使用UserControl类型,则需要进入程序和{{{ 1}}汇编参考。