我正在创建一个包含2700个常量及其说明的VB.NET类库。在使用什么样的数据结构方面需要帮助
它将包含处理非托管代码函数时使用的所有常量/错误结果。我手头已经有了所有的数据 问题在于我将如何组织它 我可以很容易地写下这样的话:我正在创建一个包含2700个常量及其说明的VB.NET类库。在使用什么样的数据结构方面需要帮助,vb.net,class,dll,data-structures,constants,Vb.net,Class,Dll,Data Structures,Constants,它将包含处理非托管代码函数时使用的所有常量/错误结果。我手头已经有了所有的数据 问题在于我将如何组织它 我可以很容易地写下这样的话: ''' <summary> ''' The operation completed successfully. ''' </summary> Private Const ERROR_SUCCESS = &H0 {0, ERROR_SUCCESS, The operation completed successfully}, {1
''' <summary>
''' The operation completed successfully.
''' </summary>
Private Const ERROR_SUCCESS = &H0
{0, ERROR_SUCCESS, The operation completed successfully},
{1, ERROR_INVALID_FUNCTION, Incorrect Function}
当然,这需要某种数据结构来保存沿着这些线的值数组:
''' <summary>
''' The operation completed successfully.
''' </summary>
Private Const ERROR_SUCCESS = &H0
{0, ERROR_SUCCESS, The operation completed successfully},
{1, ERROR_INVALID_FUNCTION, Incorrect Function}
你们都建议采用哪种结构?这是解决这个问题的更好方法。这将是一个类库,所以我不认为我可以使用一个单独的数据库。当有人使用我的类时,必须在运行时初始化此表
只是给你一些信息
Windows有2700个常量,每个常量都有自己的描述
我知道我也可以使用GetlastError,但这是一种绕过它的方法
例如:
假设有人正在使用此功能:
Imports MyClass 'which contains all error codes
Dim Error_Code as UInteger = MsiOpenProduct(ProdIndex, ProdCode)
If Error_Code = MyClass.ERROR_BAD_CONFIGURATION then
msgbox("Error Occured")
Exit Sub
End if
如果有人想要详细的错误信息
msgbox(Myclass.GetErrorDescription(Error_Code))
' Will return: The configuration information is corrupt.
这就是我想要实现的功能。我已经在数据库中有了所有的代码和描述。键入它很简单,因为我可以使用其中的数据轻松生成VB类文件。我只想知道如何有效地组织它 编写此类常量描述系列的一种方法是使用资源文件。根据您的描述,我了解到常数是一些错误代码,您对它们中的每一个都进行了描述。资源文件可以充当描述的字典,如果您需要该功能,还可以轻松支持多种语言 然后,您可以创建一个函数,该函数将接受一个常量并返回错误描述。该函数可以采用重载方法中的区域性来返回给定区域性的描述。以下是一种方法:
NameSpace ProjectName
Friend Enum WinResultCode ' probably as Long
<Description("Success")>Success = 0
<Description("File Not Found")>FileNotFound = &Hxxxxx
<Description("Invalid Function")>InValidFunction = 1
' etc
End Enum
Class ResultCode
Friend Shared Function GetErrorDescription(nErr As ReturnCode) As String
Return GetDescription(nErr)
End Class
End Class
End NameSpace
您可以将任何API结果声明为您的枚举类型(可能需要很长的长度),这样可以避免使用Ctype将结果转换为您的枚举。而且,由于主功能是共享的,因此不需要创建实例
GetDescription
函数是一个相当短的通用例程,它使用反射:
Public Shared Function GetDescription(ByVal EnumConstant As [Enum]) As String
Dim fi As FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
Dim attr() As DescriptionAttribute = _
DirectCast( _
fi.GetCustomAttributes(GetType(DescriptionAttribute), False), _
DescriptionAttribute() )
If attr.Length > 0 Then
Return attr(0).Description
Else
Return EnumConstant.ToString()
End If
End Function
这只是一个粗略的想法,一些元素范围可能需要根据细节进行调整。但这将是一种将名称和描述保持在一起并允许轻松修改的方法。在某个时候,您可以将其放入DLL。我不确定您的确切问题。如果你想减少常数的数量(2700听起来太多了),你应该提供更多关于这一切的信息。如果您想知道编写2700个变量的最佳方法,我想这取决于您:您可以设置一个易于访问的集合;一个班级;依赖外部资源(文件/DB/DLL等);。。。手动编写所有这些内容是一个很大的问题,但内存相关问题(计算机/VB.NET可以毫无问题地处理数百万件事情)是一个相当小的问题。刚刚澄清了这一点。您可以创建一个自定义类,该类将包含您想要的任意多个属性(例如:错误代码、错误描述、重要性等)并从文件、数据库和资源开始填充此类(它的集合)。。。甚至是硬编码。正如我所说的,有很多选择,我确实认为最好的学习方法实际上是犯错误:你应该尝试一些东西(不要过多地考虑客观的、最好的方法),仅仅根据我们给你的指示;记住,通常,客观上没有更好的选择。。。。或者您甚至可以创建一个函数,直接从外部文件读取数据(而不在内存中存储任何内容)。只要尝试一下,看看每种选择在特定条件下的优缺点,在真正面对真正的问题之前,不要浪费太多的时间去想所有的事情。PS:我理解Szymon的意思是使用你可以在项目中制作的硬编码(你的项目属性中有一个Resources选项卡),你可以在运行时访问它:大量的选项:只需尝试一下。我不认为这可以作为编码时的可继承类工作。还是我错了?我不确定在这种情况下,您想要继承类做什么。你能解释一下吗?对不起。不可继承。这意味着您导入了那个类,并且您可以处理所有的错误代码。包括我想要的描述功能。资源被嵌入到编译器创建的dll中,所以当你使用dll时,所有的资源都是可用的。我从没想过这样的事情是可能的。这对我来说是新的。我一定会试试这个。顺便说一句,谢谢。哦,写作不是乏味的部分。这将在一瞬间完成。一旦你把一些东西制成表格,你所需要的就是一个公式。