从通用列表创建通用字典

时间:2010-03-03 08:46:04

标签: c# generics list dictionary

我正在尝试做以下事情,但我认为我必须遗漏一些东西......(对于仿制药而言相当新)

(需要针对.NET 2.0 BTW)

interface IHasKey
{
    string LookupKey { get; set; }
}
...

public static Dictionary<string, T> ConvertToDictionary(IList<T> myList) where T : IHasKey
{
    Dictionary<string, T> dict = new Dictionary<string, T>();
    foreach(T item in myList)
    {
        dict.Add(item.LookupKey, item);
    }

    return dict;
}

不幸的是,这给出了“非泛型声明不允许约束”错误。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

您尚未声明通用参数 将您的声明更改为:

public static Dictionary<string, T> ConvertToDictionary<T> (IList<T> myList) where T : IHasKey{
}

答案 1 :(得分:1)

尝试这样的事情

public class MyObject : IHasKey
{
    public string LookupKey { get; set; }
}

public interface IHasKey
{
    string LookupKey { get; set; }
} 


public static Dictionary<string, T> ConvertToDictionary<T>(IList<T> myList) where T: IHasKey 
{ 
    Dictionary<string, T> dict = new Dictionary<string, T>(); 
    foreach(T item in myList) 
    { 
        dict.Add(item.LookupKey, item); 
    } 
    return dict; 
}

List<MyObject> list = new List<MyObject>();
MyObject o = new MyObject();
o.LookupKey = "TADA";
list.Add(o);
Dictionary<string, MyObject> dict = ConvertToDictionary(list);

您忘记了方法

中的通用参数
public static Dictionary<string, T> ConvertToDictionary<T>(IList<T> myList) where T: IHasKey

答案 2 :(得分:0)

由于输入列表中的类不同(正如您在评论中所说),您可以像@orsogufo建议的那样实现它,或者您也可以在接口本身上实现您的签名:

public static Dictionary<string, IHasKey> ConvertToDictionary(IList<IHasKey> myList) 
{
    var dict = new Dictionary<string, IHasKey>();
    foreach (IHasKey item in myList)
    {
        dict.Add(item.LookUpKey, item);
    }
    return dict;
}

如果您有一个接口的一个特定实现的列表,则使用泛型声明是最好的,如对另一个答案的注释中所述。