需要Hashtable和Arraylist
我试图在我的Windows 7 Phone应用程序中使用其他人的C#类。 这些类使用Hashtable类型的对象。
有问题的文件有
using System.Collections;
在顶部,所以我假设它是它想要的Hashtable对象。
当我尝试构建我的解决方案时,我得到的错误是找不到类型或命名空间名称’Hashtable’,是否缺少using指令或程序集引用。
在微软的Hashtable文档中,我看到它表示Assembly:mscorlib
但是如果我尝试通过Project> Add Reference添加mscorlib,VS说它无法添加它,因为它是由构建系统自动引用的。
我错过了什么?
Silverlight中不包含非generics集合,包括ArrayList
和HashTable
。
这些类是.Net 1.0(没有generics)的保留,不应该在新代码中使用。
相反,您应该使用generics集合 – List
和Dictionary
。
你有几个选择:
-
将导入更改为
using System.Collections.Generic;
并将HashTable
每次使用更改为Dictionary<>
和ArrayList
toList<>
。 -
你可能会逃脱:
using HashTable = System.Collections.Generic.Dictionary
using ArrayList = System.Collections.Generic.List
请注意,任何未来的维护者都会讨厌这样做。 -
但最好重构代码以正确使用generics集合。
-
在命名空间
System.Collections
创建一个Hashtable
类IDictionary
通过将所有内容转发到内部Dictionary
来实现IDictionary
,并实现必要的行为更改(锁定,缺少键等); 通过封装List
创建ArrayList
。 (由henon建议)
根据您使用的.NET框架,有不同的mscorlib。 如果您查看MSDN页面上的“其他版本”下拉列表,您将看到Hashtable
不是Silverlight的一部分。 您将需要使用Dictionary
(或理想情况下更强类型的键和值类型)
System.Collection是.Net的第一个版本的遗产 – 没有generics类型。
要修复你的代码,请使用Dictorany类,它是一个哈希表,并且列出了ArrayList。
它对我有用:
Dictionary
Hashtable
Dictionary
NameValueCollection
我遇到的其他问题是Encoding.ASCII也没有定义,我用一个函数stackoverflow lad写道:
public static byte[] StringToAscii(string s) { byte[] retval = new byte[s.Length]; for (int ix = 0; ix < s.Length; ++ix) { char ch = s[ix]; if (ch <= 0x7f) retval[ix] = (byte)ch; else retval[ix] = (byte)'?'; } return retval; }
学分:
ASCIIEncoding在Windows Phone 7中
所以最后返回ASCII这是做什么的:
return StringToAscii(Encoding.Unicode.GetString(result.ToArray()));