使重复代码通用

cs0*_*815 3 .net c# c#-4.0

是否可以像这样包装重复的代码:

IList<Bla1> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals("Bla1")
select
(
  (Bla1) a.Right
)).Distinct().ToList<Bla1>();
Run Code Online (Sandbox Code Playgroud)

到一个通用的构造(方法?).有很多Blas(Bla1,Bla2 ......).我猜Bla会代表T,但我对这种情况下的泛型有很多经验.谢谢.

Cri*_*scu 7

如果要测试类型而不仅仅是类型名称,那么您可以执行以下操作:

IList<T> items = Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

因此,您的通用方法可能如下所示:

IList<T> GenericMethod<T>()
{
    return Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
}
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的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();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*n B 5

如果您使用的字符串总是与类名完全相同,那么是.

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals(typeof(T).Name)
select
(
  (T) a.Right
)).Distinct().ToList<T>();
Run Code Online (Sandbox Code Playgroud)

或完全删除字符串:

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Equals(typeof(T))
select
(
  (T) a.Right
)).Distinct().ToList<T>();
Run Code Online (Sandbox Code Playgroud)