我有一个自定义类,它扩展在ParentNamespace.Controls.NumberBox.cs中定义的TextBox
,它位于自己的目录中。
namespace ParentNamespace
{
namespace Controls
{
public class NumberBox : TextBox
{
//...
}
}
}
我创建了一个名为ColumnControl
的UserControl,其上有一个NumberBox
。 ColumnControl
是它自己的项目,它包含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
。
任何人都知道我在这里做错了吗?
答案 0 :(得分:1)
请勿使用“添加为链接”。即使你知道它是同一个班级,你的程序也不会。它将多个文件视为具有不同类型的不同类。
如果您需要从多个项目中引用您的类,请将该类放在单独的项目中,右键单击“引用”并选择“添加引用”以添加该项目。
答案 1 :(得分:0)
重新阅读经过大量编辑的问题,我看到了问题:
ColumnControl是它自己的项目,其中包含
ParentNamespace.Controls.NumberBox.cs
作为链接的现有项目
即。您已在两个不同的程序集中声明NumberBox
类型。程序中的那个和作为枚举方法的类型传递的那个与UserControl
程序集中的那个完全不同(并且在实际形式中使用)。
您应该只在NumberBox
程序集中声明UserControl
类型,然后从程序中引用该类型,而不是链接源代码。或者,如果您想在不需要NumberBox
程序集的上下文中使用UserControl
类型,则需要进入程序和{{{ 1}}汇编参考。