Вот полная реализация, которую я рассматриваю:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
namespace Utils {
public static class IDictionaryExt {
public static IEnumerable<SelectListItem> ToSelectListItems<T, R>(this IDictionary<T, R> dic, T selectedKey) {
return dic.Select(x => new SelectListItem() { Text = x.Value.ToString(), Value = x.Key.ToString(), Selected=(dynamic)x.Key == (dynamic)selectedKey });
}
}
}
Обратите внимание на проверку равенства с использованием динамических приведений: (dynamic)x.Key == (dynamic)selectedKey
.Это лучший способ проверить равенство между selectedKey
и x.Key
здесь?Основываясь на комментарии @ Gabe в Оператор '==' не может быть применен к типу T? , я считаю, что это так: разрешение перегрузки откладывается до времени выполнения, но мы получаем "нормальное" разрешение перегрузки (т. е. учитывая ValueType
с и другие Object
с с перегрузками ==
против Object
с с эталонным равенством по умолчанию).