停止我的“效用”避免在不同架构之间给出错误
本文关键字:之间 错误 出错 我的 效用 | 更新日期: 2023-09-27 17:53:51
我主要在WinForms环境中编程,其中非常经常使用TreeView
控件。
在这种情况下,我有一个我开发的实用程序类,它有很多我最常用的功能-诸如将数据表转换为可输出到文本文件的分隔字符串,弹出"另存为"对话框并返回用户选择的文件名或从指定的树视图返回已检查的树节点列表等。
考虑到我有这个实用程序类,我现在试图将它添加到一个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'
编辑:澄清一下——我理解这种特定情况下的糟糕编程实践。我的问题是,如果有一种方法可以"隐藏"编译器中缺少库的函数,那么一个类可以在多个体系结构中使用,而不需要为你不会使用/需要的函数添加库。
我希望这个问题是有意义的,谢谢你的专业知识。问题是在您的实用程序类中,基于您所显示的示例,您没有显式告诉应用程序您引用的类型,因此它只能假设它是它找到的第一个。换句话说,在声明类型时使用完全限定的路径,这样您的实用程序函数可以更特定于,例如
。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
-参考网页特定控件 -
Utilities.WinForms
-参考表单特定控件
如果你坚持要这样做,那么总是有可能使用编译器指令,例如
#if TARGET_WINFORMS
... // win form specific methods
#endif
#if TARGET_WEB
... // web specific methods
#endif
... // core methods
这将允许您编译实用程序以针对特定的体系结构,从本质上剥离任何不必要的代码。这需要一点额外的家务管理,但它会达到目的。
直接复制类文件,并使用它将无法工作,因为类中的代码将无法在不引用依赖程序集(WinForms)的情况下编译。
应该这样做:
- 创建一个单独的项目来保存类。这个项目应该有webforms程序集和winforms程序集的参考。
- 为核心内容创建一个类
- 为WinForms的东西创建一个类
- 为Web的东西创建一个类。
这样你可以在一个程序集中添加所有的代码。
这是有效的,因为如果你不从你的网站中使用WinForms类,依赖的winform程序集将不会被加载(这是我们想要的,因为它们要么不能被加载,要么在运行的网站进程中不需要)。
我认为这是不可能的,因为它是一个完全不同类型的对象。
当然,在它的上下文中,它有相同的责任,但你不能在ASP webform中使用Winform Treenode