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

C# 自定义控件的类型检查失败?,c#,winforms,types,C#,Winforms,Types,我有一个自定义类,它扩展了ParentNamespace.Controls.NumberBox.cs中定义的TextBox,它位于自己的目录中 namespace ParentNamespace { namespace Controls { public class NumberBox : TextBox { //... } } } 我创建了一个名为ColumnControl的用户控件,上面有一个N

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

namespace ParentNamespace
{
    namespace Controls
    {
        public class NumberBox : TextBox
        {
            //...
        }
    }
}
我创建了一个名为
ColumnControl
的用户控件,上面有一个
NumberBox
ColumnControl
是它自己的项目,它将ParentNamespace.Controls.NumberBox.cs作为链接的现有项包含在内

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

现在麻烦来了:

在我的WinForms项目中,我尝试键入表单上的所有控件,以查找所有
TextBox
和所有
NumberBox
控件。对于my
ColumnControl
中的
文本框
控件,该类型检查工作正常。但是,由于某种原因,我无法在
列控件
上检测到我的
NumberBox

每个控件都通过以下代码运行:

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));
    }
}
如您所见,
GetType()
字符串对于
myNumberBox
和我传递给
EnumerateControlsByType
的类型是完全相同的,我只是这样传递类型:

typeof(ParentNamespace.Controls.NumberBox)
但是,尽管如此,类型检查返回false,并且我无法检测我的
NumberBox

有人知道我做错了什么吗?

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


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

重新阅读经过大量编辑的问题,我发现问题:

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

也就是说,您已经在两个不同的程序集中声明了
NumberBox
类型。程序中作为枚举方法类型传递的枚举方法与
UserControl
程序集中的枚举方法(实际形式中使用的枚举方法)完全不同


您只需创建在
UserControl
程序集中声明的
NumberBox
类型,然后从程序中引用该类型,而不是链接源代码。或者,如果您想在不需要
UserControl
程序集的上下文中使用
NumberBox
类型,则需要将其放入第三个DLL,程序和
UserControl
程序集都引用该DLL。

您需要为其他人发布更好的代码示例来诊断问题。我目前唯一的想法是“为什么不使用
is
运算符?”,但考虑到您显示的调试输出,这可能与实际问题无关。@Peter:您不能将
is
运算符与类型变量一起使用,而只能使用显式类型本身out@Grant:我是说,我通过选择Add>Existing Item>Add as Link添加了.cs(因此它实际上没有复制到我的项目中,只是被引用了)@jramm:sure,但您可以将该方法编写为泛型,以便实际类型可用。你在这里使用
typeof
的唯一原因似乎是为了得到一个
Type
的实例,你可以通过它进行比较。嗯,我很害怕,这就是为什么我在帖子中一定要提到它的原因。。好吧那么我是否需要创建一个类库来包含在其他项目中呢?我认为对我来说最好是重新构造一些东西,并将
ColumnControl
和其他自定义控件放在一个单独的控件库中,因为我仍然熟悉C#,所以现在事情有点草率。无论如何,我现在很清楚这个问题,所以谢谢!
typeof(ParentNamespace.Controls.NumberBox)