Вопрос

Я пытаюсь использовать чужие классы C# в моем приложении для Windows 7 Phone.Классы используют объекты типа Hashtable.

Файл, о котором идет речь, содержит

using System.Collections;

вверху, так что я предполагаю, что это объект хэш-таблицы, который ему нужен.

Когда я пытаюсь создать свое решение, я получаю ошибки о том, что не удалось найти тип или имя пространства имен 'Hashtable', вам не хватает директивы using или ссылки на сборку.

В документации Microsoft по Hashtable я вижу, что там написано Assembly:mscorlib

Но если я попытаюсь добавить mscorlib через Project>Добавить ссылку, VS скажет, что не может добавить его, потому что система сборки автоматически ссылается на него.

Что я упускаю?

Это было полезно?

Решение

Необменные коллекции, включая ArrayList и HashTable, не включены в Silverlight.
Эти классы являются удерживающими от .NET 1.0 (у которых не было универсальных) и не следует использовать в новом коде.

вместо этого вы должны использовать общие коллекции - List<T> и Dictionary<TKey, TValue>.

Другие советы

У вас есть несколько вариантов:

  1. Измените свой импорт на using System.Collections.Generic; и изменяйте каждое использование HashTable к Dictionary<> и ArrayList к List<>.

  2. Вы вероятно быть в состоянии выйти сухим из воды:

    using HashTable = System.Collections.Generic.Dictionary<object, object>;
    using ArrayList = System.Collections.Generic.List<object>;
    Обратите внимание, что любой будущий сопровождающий возненавидит вас за это.

  3. Но лучше провести рефакторинг кода, чтобы правильно использовать универсальные коллекции.

  4. Создайте класс Hashtable в пространстве имен System.Collections, внедрять IDictionary<object, object> перенаправляя все во внутренний Dictionary<object, object> и внести необходимые изменения в поведение (блокировка, отсутствие ключей и т.д.);Создать ArrayList путем инкапсуляции List<object>.(предложено Хеноном)

There are different mscorlibs depending on which .NET framework you are using. If you look in the "Other Versions" dropdown on the MSDN page, you will see Hashtable is not a part of Silverlight. You will need to use a Dictionary<Object, Object> (or ideally more strongly typed keys and value types)

Hashtable is not in Silverlight

But Dictionary is

System.Collection is a legacy of first version of .Net - no generic types.

To fix your code use Dictorany class which is a hashtable at heart, and List insted of ArrayList.

It worked for me changing:

Hashtable for Dictionary<object, object>

NameValueCollection for Dictionary<object, object>

Other problem I encoutered is Encoding.ASCII is not defined either, I sorted that with a function a stackoverflow lad wrote:

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;
}

credits here:

ASCIIEncoding In Windows Phone 7

So finally to return the ASCII this is what to do:

return StringToAscii(Encoding.Unicode.GetString(result.ToArray()));

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top