是否可以添加对某些源代码的引用以包含在vb.net的源文件中,winforms?

时间:2010-01-26 00:11:31

标签: c# vb.net winforms code-duplication

我不知道这叫什么,所以我很难从谷歌那里找到答案,但我对它的记忆模糊不清。

我已经对8个框架控件进行了细分(*见下文),覆盖了一些属性并在每个属性中添加了一些功能。 我所做的改变在每种情况下都是相同的。如果我做出改变,我必须通过每个班级并在那里应用相同的改变。 我希望有一个关键字,例如< IncludeSourcefile“common.vb> ,我可以把它放到每个班级。

有机会吗?

(* note)我使用术语子类,但我不知道这是否是正确的术语。我也看到它用于回拨。分类是否正确使用?

6 个答案:

答案 0 :(得分:1)

我非常怀疑这对你有用。您不能使用包含文件将更改阻塞到派生控件中。您通常在公共基类中进行更改,例如从Control派生的基类,然后从该基类派生单个控件。但是,如果你定制了8个独立的控制类,那就行不通了。复制粘贴是你的命运。

答案 1 :(得分:1)

这可能是一个疯狂的想法,但......

  1. 使用您需要的代码创建common.vb文件。
  2. 为您将添加示例代码的每个控件创建部分类文件。
  3. 创建一个批处理文件,将common.vb中的数据复制到您的分部类
  4. 创建执行该批处理文件的预构建步骤。
  5. 如果在编译之前需要将代码复制到分部类,则可以始终运行批处理文件。

    当然,假设VB.NET具有部分类的概念。不,我在家里没试过...... ;-D

答案 2 :(得分:1)

我支持nobugz的回答。即使 #Include声明,我也不认为这是个好主意。包含文件中的任何更改都可能轻易破坏任何8个子类用户控件。

但是可能的工作原理,如果所有常见的更改都可以通过事件处理程序集成到子类用户控件中,< em>或更改属于您将用户控件的公共属性设置为特定值的类型,是一个将代码更改应用于传递给它的任何用户控件的类:

Class CommonChanges

    Private Readonly WithEvents DerivedUserControl As Windows.Forms.Control

    Public Sub New(ByVal derivedUserControl As Windows.Forms.Control)
        Me.DerivedUserControl = derivedUserControl
    End Sub

    Private Sub DerivedUserControl_OnClick(sender As Object, e As EventArgs) _
                Handles DerivedUserControl.Click
        ' ... '
    End Sub

    ...  ' (more event handlers with common code go here) '

End Class

然后,您可以定义8个自定义用户控件,如:

Class MyDerivedUserControl
    Extends Button  ' (or whatever control it extends) '

    Private ReadOnly Changes As CommonChanges

    Public Sub New
        Changes = New CommonChanges(Me)
        ' ^ 'CommonChanges' will subscribe to this class's events and possibly
        '   apply other changes to the control object 'Me'.
        ...
    End Sub
End Class

Changes类型的CommonChanges对象将订阅MyDerivedUserControl类的事件,并将CommonChanges中定义的处理程序挂钩到它们。

此外,您可以通过这种方式直接将更改应用于传递给Control构造函数的CommonChanges对象。

答案 3 :(得分:1)

我记得在某个地方读过Microsoft做出特定设计决定(至少在C#中)不允许以这种方式包含外部源代码。

有人认为,虽然包含源文件在C ++中很有用,但它也会引入复杂性并降低可读性。

在OO语言中通常有很好的选择,最明显的是对象组合和委托。

以下是我过去处理这种情况的方法:

class CommonCode
{
    public void HandlePaint(Control c, PaintEventArgs a)
    {
        // Do shared code
    }
    public void HandleResize(Control c)
    {
        // Do shared code
    }

}

class MyButton : Button
{
    private CommonCode m_common=null;

    public MyButton()
    {
        m_common=new CommnCode();        
    }
    protected override OnPaint(PaintEventArgs a)
    {
        m_common.HandlePaint(this,a);
    }

    protected override void OnResize(EventArgs e)
    {
        m_common.HandleResize(this);
    }

}

class MyTextbox :Textbox
{

    private CommonCode m_common=null;

    public MyTextbox()
    {
        m_common=new CommnCode();        
    }
    protected override OnPaint(PaintEventArgs a)
    {
        m_common.HandlePaint(this,a);
    }

    protected override void OnResize(EventArgs e)
    {
        m_common.HandleResize(this);
    }

}

答案 4 :(得分:0)

将您的公共类编译到自己的DLL中。

然后右键单击解决方案资源管理器中的References文件夹,在Visual Studio中设置DLL的引用。

最后,将Using语句添加到项目的类中,以用于新DLL中的命名空间。

答案 5 :(得分:0)

您可以从visual studio创建一个类库项目(输出将是一个dll):

新项目 - &gt;班级图书馆

您可以将所有代码放在那里,然后只需将类库的引用添加到要使用它的项目中(右键单击解决方案资源管理器上的引用):

参考文献 - &gt;添加参考 - &gt;项目 - &gt; MyClassLibrary

为了能够在项目选项卡中找到MyClassLibrary,两个项目都需要在同一个解决方案中 - 否则你只需要'浏览'并指向dll本身。

然后在.vb文件中你需要使用你的类,你可以导入MyClassLibrary:

// assuming the namespace is MyClassLibrary
imports MyClassLibrary

此时您可以使用子类和控件。如果你去MyClassLibrary. intellisense会告诉你所有的课程。