首页 > 解决方案 > C#统一重复方法不同的参数类型

问题描述

我不得不复制这种方法(由另一个人制作)但我想知道是否有办法统一它,

这个收到一个IList<ViewModelA>,我需要传递给它IList<ViewModelB>

fatherId具有不同的属性,但方法中使用的属性相同Items

我想知道是否有办法将这些方法与继承或接口或其他东西统一起来。

private IList<ViewModelA> TrasnformToTree(IEnumerable<ViewModelA> source)
    {
        var modelGroups = source.GroupBy(i => i.fatherId);

        var roots = modelGroups.FirstOrDefault(g => g.Key.HasValue == false).ToList();

        if (roots.Count > 0)
        {
            var dict = modelGroups.Where(g => g.Key.HasValue)
                .ToDictionary(g => g.Key.Value, g => g.ToList());

            for (int i = 0; i < roots.Count; i++)
            {
                if (dict.ContainsKey(roots[i].Id))
                {
                    roots[i].Items = dict[roots[i].Id];
                    for (int j = 0; j < roots[i].Items.Count; j++)
                        AddChildren(roots[j].Items[j], dict);
                }
                else
                {
                    roots[i].Items = new List<ViewModelA>();
                }
            }
        }

        return roots;
    }

标签: c#genericsmethods

解决方案


这应该适用于我看到的代码:

    private interface ISomeInterface<T>
    {
        int Id { get; set; }
        int? fatherId { get; set; }
        List<T> Items { get; set; }
    }

    private IList<T> TrasnformToTree<T>(IEnumerable<T> source) where T : ISomeInterface<T>
    {
        var modelGroups = source.GroupBy(i => i.fatherId);

        var roots = modelGroups.FirstOrDefault(g => g.Key.HasValue == false).ToList();

        if (roots.Count > 0)
        {
            var dict = modelGroups.Where(g => g.Key.HasValue)
                .ToDictionary(g => g.Key.Value, g => g.ToList());

            for (int i = 0; i < roots.Count; i++)
            {
                if (dict.ContainsKey(roots[i].Id))
                {
                    roots[i].Items = dict[roots[i].Id];
                    for (int j = 0; j < roots[i].Items.Count; j++)
                        AddChildren(roots[j].Items[j], dict);
                }
                else
                {
                    roots[i].Items = new List<T>();
                }
            }
        }

        return roots;
    }

推荐阅读