如何从泛型方法返回通用List <t> <t>()

时间:2017-04-01 15:12:46

标签: c# generics

早上好,

我有一个Product {}类,它有一个Dictionary:

Dictionary<Type, List<IPropertyItem>> extensions;

我使用此方法保存数据:

public void SaveItem<T>(T item)
    {
        Type currentType = typeof(T);

        if (!extensions.ContainsKey(currentType))
        {
            extensions.Add(currentType, new List<IPropertyItem>());
        }

        if (currentType == typeof(Discount))
        {
            Discount newDiscount = (Discount)Convert.ChangeType(item, typeof(Discount));                
            extensions[currentType].Add(newDiscount);
        }
        else if(currentType == typeof(Tax))
        {
            Tax newTax = (Tax)Convert.ChangeType(item, typeof(Tax));
            extensions[currentType].Add(newTax);
        }
        else if(currentType == typeof(Size))
        {
            Size newSize = (Size)Convert.ChangeType(item, typeof(Size));
            extensions[currentType].Add(newSize);
        }           
    }

现在我想得到一个存储在我的词典中的某个值类型的列表,我的意思是我希望该方法返回一个像这个函数的List:

public List<T> GetExtensionsDictionary<T>()
    {
        Type currentType = typeof(T);
        List<T> returnedList = new List<T>();

        if (!extensions.ContainsKey(currentType))
        {
            return null;
        }

        return extensions[T];            
    }

上面调用的方法是:

List<Discount> myDiscounts = myProduct.GetExtensionsDictionary<Discount>();

thnks,

任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:3)

我相信这就是你想要的:

public List<T> GetExtensionsDictionary<T>()
{
    Type currentType = typeof(T);
    List<T> returnedList = new List<T>();

    if (!extensions.ContainsKey(currentType))
    {
        return null;
    }

    return extensions[currentType].Cast<T>().ToList();            
}

您必须使用extensions而不是currentTypeT编入索引,因为T是一个通用参数,您需要使用typeof获得的运行时类型

您可以使用linq方法CastToList将字典中currentType的集合转换为List<T>。这是列表的副本,因此请注意性能方面的考虑。

确保您是using System.Linq;