使用泛型编写函数

时间:2010-03-18 14:01:36

标签: c# generics

我正在尝试编写C#函数并使其接受任何类型参数。我想用通用列表来做,但由于某种原因我不能让它工作。怎么做?还有其他方法吗?

public class City
{
    public int Id;
    public int? ParentId;
    public string CityName;
}

public class ProductCategory
{
    public int Id;
    public int? ParentId;
    public string Category;
    public int Price;
}

public class Test
{

        public void ReSortList<T>(IEnumerable<T> sources, ref IEnumerable<T> returns, int parentId)
        {
           //how to do like this:
           /*
            var parents = from source in sources where source.ParentId == parentId && source.ParentId.HasValue select source;

            foreach (T child in parents)
            {
                returns.Add(child);
                ReSortList(sources, ref returns, child.Id);
            }
           */
        }

        public void Test()
        {
            IList<City> city = new List<City>();

            city.Add(new City() { Id = 1, ParentId = 0, CityName = "China" });
            city.Add(new City() { Id = 2, ParentId = null, CityName = "America" });
            city.Add(new City() { Id = 3, ParentId = 1, CityName = "Guangdong" });

            IList<City> results = new List<City>();
            ReSortList<City>(city, ref results, 0);  //error
        }
}

4 个答案:

答案 0 :(得分:3)

您无法在IEnumerable上添加,您必须提供支持此操作的输出类型,例如IList。

此外,您无法访问类型T上的属性ParentId,这在您的方法范围内是未知的。

[编辑]这可能会对您有所帮助:

public class City
{
    public int Id;
    public int? ParentId;
    public string CityName;
}

public class ProductCategory
{
    public int Id;
    public int? ParentId;
    public string Category;
    public int Price;
}

public class Test
{

    public void f()
    {
        List<City> city = new List<City>();

        city.Add(new City() { Id = 1, ParentId = 0, CityName = "China" });
        city.Add(new City() { Id = 2, ParentId = null, CityName = "America" });
        city.Add(new City() { Id = 3, ParentId = 1, CityName = "Guangdong" });
        int searchedId = 0;
        IList<City> results = city.FindAll(delegate(City c)
                                               {
                                                   return c.ParentId.HasValue &&
                                                          c.ParentId == searchedId;
                                               });
    }
}

答案 1 :(得分:3)

不要让它变得通用。你的方法只接受一系列City,它只附加到City列表中,那么为什么该方法需要一系列T?关于此方法, generic 没有任何内容;它不可能对整数序列或字符串序列进行操作,因此不要使它成为通用的。

答案 2 :(得分:1)

好的,我刚看了一眼,我得到了2分:

  • IListIEnumerable不可互换 - 将IList<City> results更改为IEnumerable<City> results或将您的功能更改为IList<City>而不是IEnumerable<City>。< / LI>
  • 您的Test()方法无法与类(Test)调用相同,因此请将其重命名

答案 3 :(得分:1)

如果您只有ProductCategoryCity个对象(明显不相关的对象),只需创建两个方法即可。否则,为两个对象提供一个公共接口,如IHasParentID,以便您可以公开常用功能。