【问题标题】:Is it possible to add a reference to some source code to include in a source file in vb.net, winforms?是否可以添加对某些源代码的引用以包含在 vb.net、winforms 的源文件中?
【发布时间】:2010-01-26 00:11:31
【问题描述】:

我不知道这叫什么,所以我一直在努力从谷歌上找到答案,但我对过去的记忆很模糊。

我已经对大约 8 个框架控件进行了子分类(* 见下文),覆盖了一些属性并为每个控件添加了一些功能。 我所做的更改在每种情况下都是相同的。如果我进行更改,我必须通过每个班级并在那里应用相同的更改。 我希望可能有一个关键字,例如 可以放入每个类中。

有机会吗?

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

【问题讨论】:

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


    【解决方案1】:

    我严重怀疑这对你是否有效。您不能使用包含文件将更改卡在派生控件中。您通常会在公共基类中进行更改,例如从 Control 派生的基类,然后从该基类派生单独的控件。但是,如果您自定义了 8 个单独的控件类,这将不起作用。复制和粘贴是你的事。

    【讨论】:

    • 真可惜。我想不出你需要这样一个功能的很多原因,但在这种特殊情况下,这是避免剪切和粘贴的唯一方法。
    【解决方案2】:

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

    1. 使用您需要的代码创建一个 common.vb 文件。
    2. 为您将添加示例代码的每个控件创建部分类文件。
    3. 创建一个批处理文件,将数据从 common.vb 复制到部分类中
    4. 创建一个执行该批处理文件的预构建步骤。

    如果您需要在编译之前将代码复制到部分类中,您可以随时运行批处理文件。

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

    【讨论】:

    • 嗨,是的 vb.net 确实有部分类。我以前从未在预构建中创建或包含批处理文件。我会看看那个。不过,在我的脑海中,我认为批处理文件需要一些智能 - 例如知道如何调用每个部分文件,或者,如果不是这样,知道在 class begin 语句之后粘贴代码?
    • 我在调用批处理文件,但如果您需要智能,您可能需要创建一个应用程序来执行此操作...我告诉过您这可能是一个疯狂的想法... ;-D
    【解决方案3】:

    我记得在某处读到微软做出了一个特定的设计决定(至少在 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】:

      将您的常用类编译到它们自己的 DLL 中。

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

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

      【讨论】:

      • 在上面查看我对 JohnIdol 的评论...erm 下面,或者任何结果;该死的帖子移动了!
      【解决方案5】:

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

      新建项目 --> 类库

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

      参考 --> 添加参考 --> 项目 --> MyClassLibrary

      为了能够在项目选项卡中找到 MyClassLibrary,两个项目需要在同一个解决方案中 - 否则您可以直接“浏览”并指向 dll 本身。

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

      // assuming the namespace is MyClassLibrary
      imports MyClassLibrary
      

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

      【讨论】:

      • 嗨,我想你误解了我的情况。我是从现有控件派生的,例如按钮、复选框、标签等。多重继承是不可能的,即使是(我从未使用过),我仍然认为它不适用于这种情况。
      • 我不是在谈论多重继承 - 只是向您展示如何将您的类放入 dll 并从项目中引用它
      猜你喜欢
      • 2018-02-07
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多