我主要在WinForms环境中编程,除此之外,非常经常使用TreeView
控件。
既然如此,我有一个我开发的Utility类,它有很多我最常用的功能 - 比如将DataTable转换为可以输出到文本文件的分隔字符串,弹出一个“Save-作为“对话框并返回文件名,用户从指定的树视图中选择或返回已检查的treenode列表等。
鉴于我有这个实用程序类,我现在正在尝试将它添加到ASP.Net应用程序中,它给了我很多明显的错误,例如,TreeNode
在WinForms和WinForms之间具有不同的属性ASP。
现在,我知道对我的第一个也是最明智的回应是将所有这些不同的功能分离成单独的实用程序文件和库,并根据需要/适用于每个应用程序添加它们 - 我理解它的好处和逻辑其中,我的问题更多的是关于创建类本身的理论。
有没有办法创建一个类,包括,例如,WinForms对象,我仍然可以将它添加到ASP应用程序,而不会出错? 换句话说,我不会使用这些函数,因为它们显然不适用于这种体系结构,但有一种方法可以阻止错误出现,因为对象看起来对这个体系结构是错误的,只是让编译器接受该文件 - 然后我会使用我认为适合这种架构的功能吗?
作为我的Utility类中的函数的一个愚蠢的例子,在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'
修改: 只是为了澄清 - 我理解在这种特定情况下糟糕的编程实践。我的问题更多的是试图了解是否有一种方法可以“隐藏”函数从编译器中丢失库,因此可以在多个体系结构中使用类,而无需为不使用的函数添加库/需要。
我希望这个问题有道理并感谢您的专业知识。
答案 0 :(得分: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
然而,这突出了另一个问题 - 因为您的实用程序类使用特定库中的类型,它变为依赖,就像引用您的实用程序库的任何lib /应用程序一样。你需要问的问题是,为了几种实用方法,它真的值得吗?
现在,我知道对我的第一个也是最明智的回应是将所有这些不同的功能分离成单独的实用程序文件和库,并根据需要/适用于每个应用程序添加它们 - 我理解它的好处和逻辑那个
然后为什么反对呢?正如您所看到的那样,没有 clean 方法可以做任何您想做的事情,无论哪种方式,您都会将依赖项添加到不需要的库中。
我看到你的代码很好地分成3个独立的实用程序库,即
Utilities
- 仅参考核心类型Utilities.Web
- 引用特定于网络的控件Utilities.WinForms
- 引用特定于表单的控件如果你坚持你想要这样做,那么总是有可能使用compiler directives,例如。
#if TARGET_WINFORMS
... // win form specific methods
#endif
#if TARGET_WEB
... // web specific methods
#endif
... // core methods
这将允许您编译实用程序以针对特定体系结构,实质上剥离任何不必要的代码。它涉及一些额外的管家,但它可以做到这一点。
答案 1 :(得分:1)
直接复制类文件并使用它将无法工作,因为如果不引用依赖程序集(WinForms),类中的代码将无法编译。
应该采用以下措施:
这样您就可以在一个程序集中添加所有代码。
这是有效的,因为如果你不使用你网站上的WinForms类,将不会加载相关的winform程序集(这是我们想要的,因为它们要么无法加载,要么在正在运行的网站进程中不需要)。
答案 2 :(得分:0)
我不认为这是可能的,因为它是一种完全不同类型的对象。
在它的上下文中,它具有相同的责任,但你不能在ASP网页中使用Winform Treenode。