0

我主要在 WinForms 环境中编程,除此之外,还经常使用TreeView控件。

在这种情况下,我开发了一个实用程序类,它有很多我最常用的功能 - 例如将 DataTable 转换为可以输出到文本文件的分隔字符串,弹出“另存为”对话框并返回用户选择的文件名或从指定的树视图返回检查的树节点列表等。

鉴于我有这个实用程序类,我现在正试图将它添加到 ASP.Net 应用程序中,它给了我很多明显的错误,例如,TreeNode在 WinForms 和 ASP 之间具有不同的属性。

现在,我知道对我的第一个也是最明智的反应是将所有这些不同的功能分离到单独的实用程序文件和库中,并根据需要添加它们/适用于每个应用程序 - 我了解这样做的好处和逻辑,但我的问题更多是关于创建课程本身的理论。

有没有办法创建一个包含例如 WinForms 对象的类,并且我仍然可以将它添加到 ASP 应用程序而不会出错?换句话说,我不会使用这些函数,因为它们显然不适用于这个架构,但是有没有办法阻止错误出现,只是因为对象在这个架构中看起来是错误的,只是让编译器接受那个文件- 那我就只使用我知道适合这个架构的功能吗?

作为我的实用程序类中的一个函数的愚蠢示例,它在 winForms 中很好,但在 ASP 中出现错误:

Public Shared Function CreateTemporaryNode(ByVal NodeName As String) As TreeNode
    Dim TempNode As New TreeNode

    TempNode.Name = NodeName
    TempNode.Text = NodeName

    Return TempNode
End Function

在这种情况下'Name' is not a member of 'System.Web.UI.WebControls.TreeNode'

编辑:只是为了澄清-我了解在这种特定情况下的不良编程习惯。我的问题更多是关于尝试了解是否有办法从编译器中“隐藏”缺少库的函数,这样一个类就可以在多个体系结构中使用,而无需为你不会使用的函数添加库/需要。

我希望这个问题有意义,并感谢您的专业知识。

4

3 回答 3

3

根据您展示的示例,问题出在您的实用程序类中,您没有明确告诉应用程序您指的是哪种类型,因此它只能假设它是它找到的第一个类型。换句话说,在声明类型时使用完全限定的路径,以便您的实用程序函数可以更具体,例如

Public Shared Function CreateTemporaryNode(ByVal NodeName As String) As System.Windows.Forms.TreeNode
    Dim TempNode as New System.Windows.Forms.TreeNode
    TempNode.Name = NodeName
    TempNode.Text = NodeName
    Return TempNode
End Function

但是,这突出了另一个问题 - 因为您的实用程序类使用来自特定库的类型,它变得依赖于它,任何引用您的实用程序库的库/应用程序也是如此。您需要问的问题是,为了几个实用方法真的值得吗?

现在,我知道对我的第一个也是最明智的反应是将所有这些不同的功能分离到单独的实用程序文件和库中,并根据需要添加它们/适用于每个应用程序 - 我了解这样做的好处和逻辑

那为什么要反对呢?如您所见,没有一种干净的方法可以做您想做的事,无论哪种方式,您都将向不需要的库添加依赖项。

我看到你的代码很好地分成了 3 个独立的实用程序库,即

  • Utilities- 仅引用核心类型
  • Utilities.Web- 引用特定于 Web 的控件
  • Utilities.WinForms- 引用特定于表单的控件

如果您坚持要这样做,那么总是有可能使用编译器指令,例如

#if TARGET_WINFORMS

... // win form specific methods

#endif

#if TARGET_WEB

... // web specific methods

#endif

... // core methods

这将允许您编译您的实用程序以针对特定架构,从本质上去除任何不必要的代码。它涉及一些额外的内务管理,但它可以解决问题。

于 2013-01-17T15:11:41.863 回答
1

直接复制类文件并使用它是行不通的,因为类中的代码在不引用依赖程序集(WinForms)的情况下将无法编译。

但是应该起作用的是以下内容:

  • 创建一个单独的项目来保存该类。这个项目应该有对 webforms 程序集以及 winforms 程序集的引用。
  • 为核心内容创建一个类。
  • 为 WinForms 的东西创建一个类。
  • 为 Web 内容创建一个类。

这样,您可以将所有代码添加到单个程序集中。

这是因为如果您不使用网站中的 WinForms 类,则不会加载依赖的 winform 程序集(这是我们想要的,因为它们要么无法加载,要么在正在运行的网站进程中不需要)。

于 2013-01-17T15:25:24.040 回答
0

我认为这是不可能的,因为它是一种完全不同类型的对象。

当然,在它的上下文中,它具有相同的责任,但您不能在 ASP 网络表单中使用 Winform Treenode。

于 2013-01-17T15:08:03.903 回答