0

我从下面的代码开始

Public Class DictionaryFromExcel(Of itemType)
Implements IDictionary(Of String, itemType)

Private _Dictionary As Dictionary(Of String, itemType)
Public Sub New(ByVal FileName As String, ByVal Sheet As String, ByVal StartColumnName As String)
    MyBase.New()
    _Dictionary = New Dictionary(Of String, itemType)(System.StringComparer.OrdinalIgnoreCase)

Visual Studio 2012 为其余代码创建了一个模板,为所有必需的例程留下了存根。除了 itemType 可以是字符串或小数之外,我对字典的正常实现非常满意。如何使用底层实现?

我试图通过调用底层实现来实现添加例程,但我收到一个错误,即 String 类型的值无法转换为 itemType。即使我实现了所有必需的例程,我仍然不知道如何从 itemType 转换为字符串/十进制。

_Dictionary.Add(key, value.ToString)
4

2 回答 2

1

您最好的选择是在字典上实现对象属性,例如

Dim dictionary As New Dictionary(Of String,  object)
于 2012-12-31T23:39:52.850 回答
0

由于您的类型并非旨在保存通用类型的数据,而是两种特定类型,因此您的类型没有理由应该是通用的。将其更改为简单Class DictionaryFromExcel的 .

一种方法是使用Dictionary(Of String, Object), 并让您的类型实现IDictionary(Of String, Object)。另一种方法是使用 aDictionary(Of String, String)来保存字符串,并使用 aDictionary(Of String, Decimal)来保存数字;然后,您的集合可以提供的只读实现IDictionary(Of String, Object)(可以读取存储在任一字典中的内容),具有Strings返回实现的包装器对象IDictionary(Of String, String)的属性,以及Decimals返回实现的包装器对象的属性IDictionary(Of String, Decimal)

前一种方法可以不受限制地在字典中存储任何类型的数据;这可能是也可能不是一件好事。调用者还必须在他们想要使用它的任何时候对从您的对象读取的任何数据进行类型转换。后一种方法会导致您的类型被硬编码以处理Decimaland String,但是访问您的类型的用户myThing.Decimals("George")可以使用返回的值作为 aDecimal而没有类型转换。后一种方法的最大弱点是您必须决定如果代码执行myThing.Decimals("Fred")=4.4dthen会发生什么myThing.Strings("Fred")="Flintstone"。让后一个调用无效myThing.Decimals("Fred")会令人惊讶,但如果不是,则不清楚myThing("Fred")应该返回什么。

于 2013-01-01T19:08:38.460 回答