Решено после удаления содержимого DerivedData -> Build -> Products -> Debug-iphoneos
parameters.AllKeys.ToDictionary(t => t, t => parameters[t]);
Если вы знаете, что ваш словарь всегда будет содержать строки, укажите его, чтобы он содержал строки вместо того, чтобы сделать ваш класс универсальным:
IDictionary<string, string> dict = new Dictionary<string, string>();
При этом все будет «просто работать» как написано (без общая спецификация метода).
Если вам нужно, чтобы это был общий класс и он содержал общие данные, вам нужно каким-то образом преобразовать из string
в TKey
и string
в TValue
. Вы можете предоставить делегатов вашему методу копирования, чтобы сделать это:
public void CopyFrom(NameValueCollection a, Func<string, TKey> keyConvert, Func<string, TValue> valueConvert)
{
foreach(var k in a.AllKeys)
{
dict.Add(keyConvert(k), valueConvert(a[k]));
}
}
Затем вам нужно будет передать делегата, который будет выполнять преобразование из строки в TValue
и строки в TKey
.
Не стоит забывать и о EqualityComparer. Но это не публичная собственность. Таким образом, вы должны использовать отражение, чтобы получить его.
public static IEqualityComparer GetEqualityComparer(this NameObjectCollectionBase nameObjectCollection)
{
PropertyInfo propertyInfo = typeof(NameObjectCollectionBase).GetProperty("Comparer", BindingFlags.Instance | BindingFlags.NonPublic);
return (IEqualityComparer)propertyInfo.GetValue(nameObjectCollection);
}
public static IEqualityComparer<string> GetEqualityComparer(this NameValueCollection nameValueCollection)
{
return (IEqualityComparer<string>)((NameObjectCollectionBase)nameValueCollection).GetEqualityComparer();
}
public static Dictionary<string, string> ToDictionary(this NameValueCollection nameValueCollection)
{
Dictionary<string, string> dictionary =
nameValueCollection.AllKeys.ToDictionary(x => x, x => nameValueCollection[x], nameValueCollection.GetEqualityComparer());
return dictionary;
}