【问题标题】:How do I use nested namespaces for custom controls?如何为自定义控件使用嵌套命名空间?
【发布时间】:2012-10-03 02:55:05
【问题描述】:

我在命名空间下定义了一个用户控件 ExpressionControl:

TriggerEditor.UserControls

我在命名空间下有一个表单“IfEditor”:

TriggerEditor.Forms

当我将我的控件实例添加到表单(将其命名为 expCondition)时,在设计器中生成以下代码来创建控件:

this.expCondition = new TriggerEditor.UserControls.ExpressionControl();

这会导致以下编译错误:

The type name 'UserControls' does not exist in the type 'TriggerEditor.Forms.TriggerEditor'

我不明白为什么它在“TriggerEditor.Forms.TriggerEditor”中查找;这不是代码所说的。现在,我可以通过修改行来手动解决此错误,删除“TriggerEditor”。在“TriggerControls”之前,例如:

this.expCondition = new UserControls.ExpressionControl();

这可以满足编译器的要求,但是我显然不想在每次将我的 ExpressionControl 实例添加到表单时都这样做。我该如何避免这种情况?

【问题讨论】:

    标签: c# winforms user-controls namespaces windows-forms-designer


    【解决方案1】:

    看起来你可能在TriggerEditor.Forms 命名空间中有一个TriggerEditor 类;是这样吗?

    如果是这样,因为TriggerEditor 类在您当前的命名空间中,您与该类“更接近”,因此它正在寻找一个子类。

    【讨论】:

    • 你是对的。我一直在拆分我的项目并重命名类,甚至没有注意到我手上有命名冲突。
    【解决方案2】:

    避免对类和命名空间使用相同的名称!?

    显然,在命名空间 TriggerEditor.Forms 中,您有一个名为 TriggerEditor 的类,与您的 IfEditor 类在同一命名空间中。

    因此,在查找TriggerEditor.UserControls.ExpressionControl 时,编译器会查找TriggerEditor 类(在同一个命名空间中,因此更接近)而不是TriggerEditor 命名空间...

    通常,为避免这种情况,您会使用 namespace alias qualifier,但在 Designer 生成的类中,您无法真正控制它。

    【讨论】:

    • 你的回答也是正确的。不幸的是,我不能接受多个。不过,赞成,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多