有没有办法扩展C#List类,允许我附加一种特定于一种类型的自定义方法?
在我的示例中,我有一个LatestNews
对象列表。其中每个都包含Category
类型的属性。
我想要做的是将自定义方法附加到List<>
,该方法将返回Category
集合中所有唯一LatestNews
个对象。
我有以下工作使用泛型,但我注意到,如果我然后声明一个不同类型的List<>
(即字符串),则此方法可用。
public static List<LatestNewsCategory> getUniqueCategories<T>(this IList<T> list)
{
List<LatestNewsCategory> catList = new List<LatestNewsCategory>();
List<LatestNews> myNewsList = (List<LatestNews>)list;
foreach (LatestNews news in myNewsList)
{
if (catList.Find(LatestNewsCategory => LatestNewsCategory.ID == news.Category.ID) == null)
{
catList.Add(news.Category);
}
}
return catList;
}
我应该采用不同的方法吗?
我是否应该考虑创建一个扩展List的自定义类?
由于
答案 0 :(得分:2)
您应该在签名中更改通用类型。
改变它是这样的:
public static List<LatestNewsCategory> getUniqueCategories(this IList<LatestNews> list)
答案 1 :(得分:0)
如果您希望此扩展程序仅用于LatestNews
列表,请使用LatestNews
类型对您的列表进行参数化:
public static List<LatestNewsCategory> getUniqueCategories(
this IList<LatestNews> list)
{
// ...
}
附注1 - 我们为公共成员使用PascalCase名称,例如GetUniqueCategories
附注2 - 您可以使用LINQ从最新新闻列表中获取不同的类别:
return list.Select(n => n.Category)
.GroupBy(c => c.ID)
.Select(g => g.First())
.ToList();
或者如果您在Equals
类型上覆盖了GetHashCode
和LatestNewsCategory
,那么您可以简单地
return list.Select(n => n.Category).Distinct().ToList();
附注3 - 您可以为IEnumerable<LatestNews>
创建扩展名,因此您只需枚举列表项。
答案 2 :(得分:0)
你试过衍生吗?如果你这样做,试着把它保持在通用的一面,比如:
class SpecializedList<T> extends List<T>
{
// put your specialized generic<T> methods here
}
重用代码可能是件好事,但是当你说2或3个专门的方法时,这更有意义。