是否可以像这样包装重复的代码:
IList<Bla1> Bla1s = (from a in Containers
where a.Right.GetType().Name.Equals("Bla1")
select
(
(Bla1) a.Right
)).Distinct().ToList<Bla1>();
进入泛型构造(方法?)。有很多Blas(Bla1,Bla2 ......)。我猜Bla会代表T,但我对这种情况下的泛型有很多经验。感谢。
答案 0 :(得分:7)
如果您想测试类型而不仅仅是输入名称,那么您可以执行以下操作:
IList<T> items = Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
因此,您的通用方法可能如下所示:
IList<T> GenericMethod<T>()
{
return Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
}
作为评论中提到的hvd,上面的代码也会返回任何Right
元素,该元素属于从T
派生的类型。如果您的目的是仅过滤类型T
,请改用:
IList<T> GenericMethod<T>(IEnumerable<Container> containers)
{
return containers.Select(c => c.Right)
.Where(x => x.GetType() == typeof(T)).Cast<T>()
.Distinct().ToList();
}
答案 1 :(得分:5)
如果你使用的字符串总是与类名完全相同,那么是。
IList<T> Bla1s = (from a in Containers
where a.Right.GetType().Name.Equals(typeof(T).Name)
select
(
(T) a.Right
)).Distinct().ToList<T>();
或完全删除字符串:
IList<T> Bla1s = (from a in Containers
where a.Right.GetType().Equals(typeof(T))
select
(
(T) a.Right
)).Distinct().ToList<T>();